我有一个很大的 Laravel 查询生成器查询,这是它的最小版本
$query = DB::table('trainings')
->select(
'trainings.id as training_id as training_id',
'taggables.id as taggables_id',
'taggables.tag_id as taggables_tag',
'tags.id as tags_id',
DB::raw('GROUP_CONCAT(tags.category) as tags_category'),
DB::raw('GROUP_CONCAT(tags.value) as tags_value')
)
->join('taggables', function($join) {
$join->on('taggables.taggable_id', 'trainings.id')
->where('taggables.taggable_type', 'App\\Training')
;
})
->leftjoin('tags','tags.id','=','taggables.tag_id')
->groupBy('trainings.id')
-get()
;
生成此sql:
select trainings.id as training_id,
taggables.id as taggables_id,
taggables.tag_id as taggables_tag,
tags.id as tags_id,
GROUP_CONCAT(tags.category) as tags_category,
GROUP_CONCAT(tags.value) as tags_value
from trainings
inner join taggables on taggables.id = trainings.id and taggables.taggable_type = "App\\Training"
left join tags on tags.id = taggables.tag_id
group by trainings.id
结果是:
当我在 phpunit test 上运行相同的代码(使用不同的数据+ sqlite)时,结果如下所示:
array:1 [
0 => {#2579
+"training_id": "2"
+"taggables_id": "1"
+"taggables_tag": "{"value":1,"category":1,"id":1}"
+"tags_id": null
+"tags_category": null
+"tags_value": null
}
]
由于某种原因,“taggables_tag”返回相关标签表数据的 JSON/对象,并且tags_字段为空(可能是因为最后一个连接不起作用)。
有什么想法可以解决这个问题吗?
更新
问题是连接,而不是group_concat:
$query = DB::table('trainings')
->join('taggables', function($join) {
$join->on('taggables.taggable_id', 'trainings.id')
->where('taggables.taggable_type', 'App\\Training')
;
})
->get()
Returns:
+"tag_id": "{"value":1,"category":1,"organisation_id":1,"updated_at":"2020-01-20 10:29:56","created_at":"2020-01-20 10:29:56","id":1}"
+"taggable_id": "2"
+"taggable_type": "App\Training"
最佳答案
我能够通过以下方式解决这个问题:
// running tests (SQLite) returns json of the related mode
if (App::environment() === 'testing') {
$query->addSelect('taggables.tag_id->value as taggables_tag_id');
} else {
$query->addSelect('taggables.tag_id as taggables_tag_id');
}
并将最后一个 leftjoin 更改为 ->leftjoin('tags','tags.id','=','taggables_tag_id')
关于mysql - 具有多态连接的 Laravel 查询生成器不适用于 SQLite,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59820241/