一尘不染

Laravel Eloquent按关系表列排序

php

我试图按shop_products表中的pinned列对shop_products_options表中的产品进行排序:

$products = Shop\Product::with(['options' => function ($query) {

    $query->orderBy('pinned', 'desc');

}])->paginate(5);

我在商店\产品模型中设置关系:

public function options()
{
    return $this->hasOne('Shop\Options');
}

但是产品没有分类。我得到一个仅适用于shop_products_options表的查询。

SELECT * FROM `shop_products_options` WHERE `shop_products_options`.`product_id` in ('8', '9', '10', '11', '12') ORDER BY `pinned` DESC

如何解决?


阅读 669

收藏
2020-05-29

共1个答案

一尘不染

急切的加载使用单独的查询,因此您需要为此加入:

$products = Shop\Product::join('shop_products_options as po', 'po.product_id', '=', 'products.id')
   ->orderBy('po.pinned', 'desc')
   ->select('products.*')       // just to avoid fetching anything from joined table
   ->with('options')         // if you need options data anyway
   ->paginate(5);

SELECT子句是为了不将联接的列追加到Product模型中。


编辑:根据@alexw注释-如果需要,您仍然可以包括联接表中的列。您可以将它们添加到select或致电addSelect/selectRaw等。

2020-05-29