具有多态连接的 Laravel 查询生成器在 SQLite 上不起作用

Posted

技术标签:

【中文标题】具有多态连接的 Laravel 查询生成器在 SQLite 上不起作用【英文标题】:Laravel Query Builder with polymorphic joins not working on SQLite 【发布时间】:2020-05-06 06:47:17 【问题描述】:

我有一个大型 Laravel Query Builder 查询,这是它的最小版本

$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 测试(使用不同的数据 + 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"

【问题讨论】:

请发布您的查询... 添加了查询生成器查询 我认为您需要使用 ->toSql() 并查看查询生成的原始 sql。你 dd($query)? 原始 sql 已经存在 :) "生成这个 sql:" 【参考方案1】:

我能够通过以下方式解决这个问题:

// 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')

【讨论】:

以上是关于具有多态连接的 Laravel 查询生成器在 SQLite 上不起作用的主要内容,如果未能解决你的问题,请参考以下文章

加入的 Laravel 查询生成器计数

具有 DATE mysql 功能的 Laravel 查询生成器

Laravel 在连接结果上不同,在查询生成器中不起作用

查询生成器 Laravel 左连接

Laravel 使用查询生成器进行嵌套连接查询

如何在 Laravel 中使用具有多态关系的“group by”?