Eloquent Left Join,获得意想不到的结果

时间:2015-09-18 04:18:28

标签: php join eloquent left-join

概述:

我有两个名为event_metaoptions的表。

选项:

enter image description here

活动元素:

enter image description here

我有一个名为Event Meta的表,其中存储了特定事件的子信息。现在我想要发生的事情就是在eloquent中使用event_meta连接optionsleftjoin表。

这是我的代码。

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

enter image description here

它从名为Top Up的选项表中检索值为6

的值

enter image description here

请注意meta_key徽标meta_value中的第一个字符,它在选项的ID中具有相同的值。

enter image description here

我尝试将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;
}

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我已经得到了这个问题的答案!这不是因为它是Eloquent,而是真正在MYSQL查询上有问题。从技术上来说,我没有把它转换成相同的类型。

感谢这位帮忙的人在这里回答了我的相关问题。

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

  

将您的数字options.id字段转换为与之相同的类型   你的JOIN中的event_meta.meta_value。

所以我所做的就是将我的options.id AS TEXT转换为与我的左连接查询中event_meta.meta_value相同的类型。

所以我就这样投了它

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

Cast的参考(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;
}

第二个解决方案来自我的老板工作(致记者)。他所做的是他在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;
}