Eloquent Left Join, получивший неожиданный результат

Обзор:

У меня есть две таблицы, называемые event_meta и options .

Опции:

введите описание изображения здесь

Событие Meta:

введите описание изображения здесь

У меня есть таблица под названием Event Meta, где хранится вспомогательная информация определенного события. Теперь я хочу, чтобы связать event_meta и options используя leftjoin в красноречиве.

Вот мой код для этого.

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

Теперь проблема в том, что .. Если я meta_key логотип meta_key

введите описание изображения здесь

Он извлекает значение из таблицы опций Top Up которая имеет идентификатор 6

введите описание изображения здесь

Обратите внимание на первый символ в meta_key логотипа meta_value он имеет то же значение в id опции.

введите описание изображения здесь

Я попробовал изменить 7 , изменение значения, и он получает Vending POS опциона.

Любое решение для этого? Однако этого не должно произойти. Поскольку значение логотипа waaay длиннее фактического идентификатора опций.

— Редактировать —

Мои попытки фиксировать его, ожидая помощи.

1-я попытка:

Я попробовал это решение только ради того, что он может быть исправлен. Все еще не работает.

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

У меня есть ответ на этот вопрос! Это не потому, что это Красноречивый, но это действительно в запросе MYSQL, у которого есть проблема. Ну технически моя вина за то, что она не превратила его в тот же тип.

Благодаря помощи этого парня, который ответил на мой родственный вопрос здесь.

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

Введите числовое поле options.id в том же типе, что и event_meta.meta_value в вашей JOIN.

Итак, что я сделал, я преобразовал свои options.id AS TEXT, чтобы иметь тот же тип, что и event_meta.meta_value в моем левом запросе соединения.

Поэтому я бросил это так

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

Ссылка для роли (SO ANSWER): https://stackoverflow.com/a/12127022/1699388

Так что это похоже на это!

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

Второе решение от моего начальника в работе (Кредиты к нему). То, что он сделал, – это добавить еще один символ AND влево, чтобы преобразовать event_meta.meta_value в целое число, просто умножив его на 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; }