raw query outer multiple left consultas php join eloquent left-join

php - query - Eloquent Left Join, obteniendo resultados inesperados



laravel multiple database (2)

Visión de conjunto:

Tengo dos tablas llamadas event_meta y options .

Opciones:

Evento Meta:

Tengo una tabla llamada Event Meta donde se almacena la información secundaria del evento específico. Ahora lo que quiero pasar es conectar la tabla event_meta y options usando leftjoin en elocuente.

Aquí está mi código para eso.

public function getMetaValue($key) { $event_meta = $this->hasOne(''Core/Event/EventMeta'', ''event_id'') ->leftjoin(''options'', ''options.id'', ''='', ''event_meta.meta_value'') ->where(''meta_key'', ''='', $key) ->first(); // If Option[table] value is empty, it will retrieve for Event Meta''s[table] value, else It will return false. return (empty($event_meta->value)) ? (empty($event_meta->meta_value)) ? false : $event_meta->meta_value : $event_meta->value; }

Ahora el problema es ... si recupero el logo de meta_key ...

Recupera el valor de la tabla de opciones llamada Top Up que tiene el id de 6

Observe que el primer carácter en el meta_key logotipo de meta_value tiene el mismo valor en la identificación de la opción.

Traté de cambiar el 6 al 7 , el cambio del valor y recupera el Vending POS la opción.

¿Alguna solución para esto? Sin embargo, esto no se supone que suceda. Dado que el valor del logo es más largo que el ID real de las opciones.

--- Editar ---

Mis intentos lo arreglaron mientras esperaba ayuda.

1er intento:

Intenté esta solución solo por el bien que podría ser corregido. Todavía no funciona.

public function getMetaValue($key) { $event_meta = $this->hasOne(''Core/Event/EventMeta'', ''event_id'') ->leftjoin(''options'', function($query) { $query->on(''options.id'', ''='', ''event_meta.meta_value''); })->where(''meta_key'', ''='', $key) ->first(); return (empty($event_meta->value)) ? (empty($event_meta->meta_value)) ? false : $event_meta->meta_value : $event_meta->value; }


Value insert of logo meta key value in worng table please correct Entry. Your logo value insert in options table and option id insert in Event Meta: table option table =========== id type value 11 logo 6b3bca56b9c693db313b667ae77507291b47ddd55e382.. Event Meta: ============ id event_id meta_key meta_value 29 1 logo 11 Now You retrive the Meta_key logo and use Your query so give perfect Result <?php public function getMetaValue($key) { $event_meta = $this->hasOne(''Core/Event/EventMeta'', ''event_id'') ->leftjoin(''options'', function($query) { $query->on(''options.id'', ''='', ''event_meta.meta_value''); })->where(''meta_key'', ''='', $key) ->first(); return (empty($event_meta->value)) ? (empty($event_meta->meta_value)) ? false : $event_meta->meta_value : $event_meta->value; } ?>


¡Tengo una respuesta a esta pregunta! No es porque sea elocuente, sino que está realmente en la consulta MYSQL que tiene un problema. Bien técnicamente es mi culpa por no convertirlo al mismo tipo.

Gracias a la ayuda de este tipo que respondió mi pregunta relacionada aquí.

https://.com/a/32647701/1699388

Transmite tu campo numeric options.id al mismo tipo que event_meta.meta_value en tu JOIN.

Entonces, lo que hice fue convertir mis options.id AS TEXT para tener el mismo tipo que event_meta.meta_value en mi consulta de combinación izquierda.

Así que lo fundí así

$leftjoin->on(DB::raw(''CAST(options.id AS CHAR(1000))''), ''='', ''event_meta.meta_value'');

Referencia para Cast (SO ANSWER): https://.com/a/12127022/1699388

Entonces, ¿qué parece es esto?

public function getMetaValue($key) { $event_meta = $this->hasOne(''Core/Event/EventMeta'', ''event_id'') ->leftjoin(''options'', function($leftjoin) { $leftjoin->on(DB::raw(''CAST(options.id AS CHAR(1000))''), ''='', ''event_meta.meta_value''); })->where(''meta_key'', ''='', $key) ->first(); return (empty($event_meta->value)) ? (empty($event_meta->meta_value)) ? false : $event_meta->meta_value : $event_meta->value; }

La segunda solución es de mi jefe en el trabajo (Créditos para él). Lo que hizo fue agregar otro AND en el enlace izquierdo para convertir event_meta.meta_value a un entero simplemente multiplicándolo a 1.

public function getMetaValue($key) { $event_meta = $this->hasOne(''Core/Event/EventMeta'', ''event_id'') ->leftjoin(''options'', function($leftjoin) { $leftjoin->on(''options.id'', ''='', ''event_meta.meta_value''); $leftjoin->on(DB::raw(''CONCAT("", event_meta.meta_value * 1)''), ''='', ''event_meta.meta_value''); })->where(''meta_key'', ''='', $key) ->first(); return (empty($event_meta->value)) ? (empty($event_meta->meta_value)) ? false : $event_meta->meta_value : $event_meta->value; }