Eloquent 左联接,得到意想不到的结果

Eloquent Left Join, getting unexpected result

概览:

我有两个 table 叫做 event_metaoptions

选项:

事件元数据:

我有一个名为 Event Meta 的 table,其中存储了特定事件的子信息。现在我想要发生的是在 eloquent.

中使用 leftjoin 连接 event_metaoptions table

这是我的代码。

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 徽标...

它从名为 Top Up 的选项 table 中检索值,其 ID 为 6

注意 meta_key 徽标中的第一个字符 meta_value 它与选项 ID 中的值相同。

我尝试将 6 更改为 7,值的更改会检索选项的 Vending POS

有什么解决办法吗?但这不应该发生。由于徽标的值比选项的实际 ID 长。

--- 编辑 ---

我在等待帮助时尝试修复它。

第一次尝试:

我尝试了这个解决方案只是为了它可能会被修复。还是不行。

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

我得到了这个问题的答案!不是因为它是 Eloquent,而是它确实在 MYSQL 查询上有问题。好吧,从技术上讲,我没有将其转换为相同类型是我的错。

感谢这位回答我相关问题的人的帮助。

Cast your numeric options.id field to the same type as event_meta.meta_value in your 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):

原来是这样的!

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

第二个解决方案来自我的老板(感谢他)。他所做的是,他在 leftjoin 上添加了另一个 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;
}