Laravel concat en consulta (donde condición)

2 minutos de lectura

Avatar de usuario de Jonathan
jonathan

Soy nuevo en laravel y me enfrento a un problema al crear una consulta simple:

$query->orWhere("CONCAT(`nvp`, ' ', `vpv`)", 'LIKE', "%$this->searchNeedle%");

Esta línea anterior es una de varias condiciones en una condición de consulta encapsulada. Creo que las otras líneas no son necesarias para este caso, pero dígame si necesita verlas.

Descubrí que el desarrollador decidió agregar a

`

antes y después del primer parámetro o Dónde/Dónde, lo que causa el problema de que no puedo usar una concatenación simple, porque la línea anterior dará como resultado:

`CONCAT(`vpv`, ' ', `nvp`)` LIKE ?)' 
↑                         ↑
this                    & this

Dado que esto se agrega automáticamente, no puedo eliminarlo sin sobrescribir una función de laravel-core, lo cual no haré. ¿Hay algún “hack” basado en SQL que maneje estos dos `? Algo en el camino como 1 = 1, ¿sabes?

¿Quizás tenga otra solución para obtener el resultado deseado, comparando una cadena con dos filas en combinación?

  • Tal vez también funcione [iterare where () by request on for loop ](stackoverflow.com/a/71666425/14664943)

    – heriberto hernández torres

    29 de marzo de 2022 a las 17:37

Laravel hace algunas cosas detrás de escena, como agregar las marcas de verificación por ti.

Afortunadamente, también ofrece un par de herramientas para seguir haciendo el trabajo por usted…

Para este tipo de cosas, DB::raw() normalmente funciona muy bien. Prueba algo como esto…

$query->orWhere(DB::raw("CONCAT(`nvp`, ' ', `vpv`)"), 'LIKE', "%".$this->searchNeedle."%");

  • Ahora la aplicación no fallará, pero resultará en esto: CONCAT(nvp”, vpv) LIKE ‘%users name%’ es nulo

    – Jonathan

    11 de agosto de 2014 a las 13:37


  • Creo que mi sintaxis estaba un poco mal, solo modifiqué la respuesta.

    – usuario1669496

    11/08/2014 a las 13:40

  • Mira eso. Funciona de maravilla. Gracias !!

    – Jonathan

    11 de agosto de 2014 a las 13:42

  • Huelo inyección de sql con esta respuesta, `$this->searchNeedle` viene directamente del usuario.

    –Moisés Ndeda

    27 de julio de 2017 a las 12:08

  • Laravel manejará el enlace de parámetros por usted, por lo que no hay posibilidad de inyección de SQL. Si todo estuviera envuelto en DB::raw() estarías en lo cierto.

    – usuario1669496

    27 de julio de 2017 a las 12:31

Avatar de usuario de Joseph Silber
José Silber

Usar orWhereRaw para ejecutar una consulta where sin procesar:

$query->orWhereRaw("CONCAT(`nvp`, ' ', `vpv`) LIKE ?", ['%'.$this->searchNeedle.'%']);

  • No me funciona (error de SQL). Lo arreglé poniendo el % en el segundo argumento: $query->orWhereRaw("CONCAT(nvp, ' ', vpv) LIKE ?", ["%".$this->searchNeedle."%"]);

    – mhellmeier

    31 de diciembre de 2017 a las 11:51


  • ¿Puedo pedirle que eche un vistazo a una pregunta relacionada con la combinación de tablas de Laravel aquí: stackoverflow.com/questions/52149031/…?

    –Istiaque Ahmed

    3 sep 2018 a las 14:31

  • Debe usar ` en lugar de ‘ para las columnas.

    – Abdalá Shakir

    11/03/2022 a las 20:52

¿Ha sido útil esta solución?