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;
}