概述:
我有两个名为event_meta
和options
的表。
选项:
活动元素:
我有一个名为Event Meta的表,其中存储了特定事件的子信息。现在我想要发生的事情就是在eloquent中使用event_meta
连接options
和leftjoin
表。
这是我的代码。
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
的选项表中检索值为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;
}
答案 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;
}