Eloquent 左联接,得到意想不到的结果
Eloquent Left Join, getting unexpected result
概览:
我有两个 table 叫做 event_meta
和 options
。
选项:
事件元数据:
我有一个名为 Event Meta 的 table,其中存储了特定事件的子信息。现在我想要发生的是在 eloquent.
中使用 leftjoin
连接 event_meta
和 options
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;
}
概览:
我有两个 table 叫做 event_meta
和 options
。
选项:
事件元数据:
我有一个名为 Event Meta 的 table,其中存储了特定事件的子信息。现在我想要发生的是在 eloquent.
中使用leftjoin
连接 event_meta
和 options
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;
}