微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

所以我使用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]:语法错误或访问冲突:1055’test.inventories.name’不在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 =>我的database.PHP中为false.

解决方法:

由于错误表明当name列不在GROUP BY子句中时会发生此问题.

解决这个变化

'strict' => true, 

在config / database.PHP文件中的连接下的MysqL配置中

'strict' => false,

此外,我强烈建议使用polymorphic relations而不是雄辩的左连接.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐