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