Laravel - 查询构建器 - 左连接多态关系,仅限于

时间:2017-01-05 18:44:29

标签: php laravel vue.js laravel-5.3 laravel-query-builder

所以我使用Vue 2.0和Laravel 5.3来创建应用程序。

我使用Laravel提供的内置分页,用Vue实现了我自己的可排序表。

一切都很完美 - 除了,我试图离开加入媒体"多态表,所以我可以在我的表中显示一个图像。

为了启用排序,我必须使用查询构建器,因为您可以使用Eloquent(AFAIK)对关系进行排序。

我将我的关系定义为:

$inventories = $inventories->leftjoin('users as inventory_user', 'inventories.user_id', '=', 'inventory_user.id');
$inventories = $inventories->leftjoin('categories as category', 'inventories.category_id', '=', 'category.id');
$inventories = $inventories->leftjoin('inventories as parent', 'inventories.parent_id', '=', 'parent.id');

哪项工作很棒。但是,我究竟如何在不重复(复制)任何行的情况下加入多态关系?

我有这个:

$inventories = $inventories->leftJoin('media', function($q) {
    $q->on('media.model_id', '=', 'inventories.id');
    $q->where('media.model_type', '=', 'App\Models\Inventory');
});

哪个显示媒体(如果它在多态表中有关系)。但是,如果我有1个特定库存项目的5个图像(媒体),我的查询会重复库存,但是在我的情况下,它会重复5次。

这是我的选择查询:

    $inventories = $inventories->select(DB::raw("
            inventories.id as inventory_id,
            inventories.name as inventory_name,
            inventories.order_column as inventory_order_column,
            category.id as category_id,
            category.name as category_name,
            parent.name as parent_name,
            parent.id as parent_id,
            inventories.updated_at as inventory_updated_at,
            media.name
    "));

我想我需要使用groupBy,但我不确定我在哪里定义它。如果我做

$inventories = $inventories->groupBy('inventories.id');

我明白了 SQLSTATE[42000]: Syntax error or access violation: 1055 'test.inventories.name' isn't in GROUP BY...

是否有人遇到类似情况或知道在哪里放置我的groupBy来显示1 /不同的库存物品?

修改

我能够使用以下方法修复:

$inventories = $inventories->leftJoin('media', function($q) {
    $q->on('media.model_id', '=', 'inventories.id');
    $q->where('media.model_type', '=', 'App\Models\Inventory');
    $q->orderBy('media.order_column', 'asc');
    $q->groupBy('model.model_id');
});

然后在我的strict => false中设置database.php

2 个答案:

答案 0 :(得分:1)

我想你会在这里添加它:

$categories = $categories->select(DB::raw("
        inventories.id as inventory_id,
        inventories.name as inventory_name,
        inventories.order_column as inventory_order_column,
        category.id as category_id,
        category.name as category_name,
        parent.name as parent_name,
        parent.id as parent_id,
        inventories.updated_at as inventory_updated_at,
        media.name
"))->groupBy('inventories.id');

答案 1 :(得分:1)

由于错误表明当name列不在GROUP BY子句中时会出现此问题。

解决此变化

'strict' => true, 

mysql文件中connections下的config/database.php配置

'strict' => false,

此外,我强烈建议使用polymorphic relations而不是雄辩。