Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 雄辩的左键连接,得到意外的结果_Php_Join_Eloquent_Left Join - Fatal编程技术网

Php 雄辩的左键连接,得到意外的结果

Php 雄辩的左键连接,得到意外的结果,php,join,eloquent,left-join,Php,Join,Eloquent,Left Join,概述: 我有两个名为event\u meta和options的表 选项: 事件元: 我有一个名为Event Meta的表,其中存储了特定事件的子信息。现在我要做的是在eloquent中使用leftjoin连接event\u meta和options表 这是我的密码 public function getMetaValue($key) { $event_meta = $this->hasOne('Core\Event\EventMeta', 'event_id')

概述:

我有两个名为
event\u meta
options
的表

选项:

事件元:

我有一个名为Event Meta的表,其中存储了特定事件的子信息。现在我要做的是在eloquent中使用
leftjoin
连接
event\u meta
options

这是我的密码

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_键
logo

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

请注意
meta_键
logo的
meta_值
中的第一个字符在选项的id中具有相同的值

我尝试将
6
更改为
7
,值更改后,它将检索选项的
自动售货机

有什么解决办法吗?但这不应该发生。因为logo的值比选项的实际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;
}
在工作表中插入徽标元键值,请更正输入。
在选项表中插入徽标值,在事件元:表中插入选项id
选项表
===========
id类型值
11徽标6b3bca56b9c693db313b667ae77507291b47ddd55e382。。
事件元:
============
id事件\ id元\键元\值
29 1标志11
现在,您检索Meta_key徽标并使用您的查询,以便给出完美的结果
在工作表中插入徽标元键值,请更正输入。
在选项表中插入徽标值,在事件元:表中插入选项id
选项表
===========
id类型值
11徽标6b3bca56b9c693db313b667ae77507291b47ddd55e382。。
事件元:
============
id事件\ id元\键元\值
29 1标志11
现在,您检索Meta_key徽标并使用您的查询,以便给出完美的结果

我已经找到了这个问题的答案!这并不是因为它很有说服力,而是在MYSQL查询上确实存在问题。从技术上讲,我的错是没有把它转换成同一种类型

感谢这个家伙的帮助,他在这里回答了我的相关问题

将numeric options.id字段强制转换为与相同的类型 event_meta.meta_加入时的值

因此,我所做的是将我的
options.id
转换为文本,使其与我的左连接查询中的
event\u meta.meta\u value
具有相同的类型

所以我是这样铸造的

$leftjoin->on(DB::raw('CAST(options.id AS CHAR(1000))'), '=', 'event_meta.meta_value');
Cast参考(SO答案):

所以它看起来是这样的

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上添加另一个
,将
事件meta.meta\u值
乘以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;
}

我已经找到了这个问题的答案!这并不是因为它很有说服力,而是在MYSQL查询上确实存在问题。从技术上讲,我的错是没有把它转换成同一种类型

感谢这个家伙的帮助,他在这里回答了我的相关问题

将numeric options.id字段强制转换为与相同的类型 event_meta.meta_加入时的值

因此,我所做的是将我的
options.id
转换为文本,使其与我的左连接查询中的
event\u meta.meta\u value
具有相同的类型

所以我是这样铸造的

$leftjoin->on(DB::raw('CAST(options.id AS CHAR(1000))'), '=', 'event_meta.meta_value');
Cast参考(SO答案):

所以它看起来是这样的

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上添加另一个
,将
事件meta.meta\u值
乘以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;
}