mysql - 具有多态连接的 Laravel 查询生成器不适用于 SQLite

标签 mysql laravel sqlite polymorphism group-concat

我有一个很大的 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

结果是:

enter image description here

当我在 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/

相关文章:

php - 布局在 Laravel 4 中抛出 "Attempt to assign property of non-object"

javascript - 存储前端记录的用户数据

android - 使用 LIKE 查询但区分大小写

java - 将数据从 ListView (从 Rest Api 生成)传递到另一个 Activity 并将其保存到 SQLite 数据库中

python - 如何提高带有外键的 SQLite 表的 DELETE 性能?

php - 将 lang 函数放入 php 字符串中

mysql - 如何选择具有一个不同值和多个重复值的行?

php 随机消息在 20 秒内淡入下一条随机消息

php - 1250 - 来自其中一个 SELECT 的表 'sub' 不能在全局 ORDER 子句中使用

php - 在 Laravel 中获取点 mysql 列