如何排序在Laravel与关系

bksxznpy  于 2023-03-13  发布在  其他
关注(0)|答案(1)|浏览(148)

我想按类别名称对这些数据进行排序。这是我的示例表

以下是示例数据:

这是输出结果,也是我期望的结果:

bnlyeluc

bnlyeluc1#

我尝试了一下,似乎嵌套的急切加载使用IN创建了另一个查询。它不是一个连接,因此您不能引用前一个查询。因此name将引用类别,但它将与透视表1:1匹配,因此这个orderBy将是无用的,因为它将使用IN之后的categoryItems排序。
看起来您需要执行一个连接,以便能够在透视表级别执行orderBy,在透视表级别,类别顺序很重要,但是您category.name在该级别也没有www.example.com可用。
当然,除非你有一个加入。
因此,如果您决定使用联接,它将类似于:

$allItems = Item::with(['categoryItems' => function($q1){
    // Note: Categories here is a reference to the table name not the model.
    $q1->join('Categories','category_id','=','categories.id')
    ->orderBy('name','ASC');
}]);

$allItems = $items->get();

foreach ($allItems as $item) {
    echo $item->name.':<br>';
    foreach($item['categoryItems'] as $cat) {
        echo "- {$cat['name']}<br>";
    }
   echo '<br>';
}

请注意,外部查询也可以使用orderBy,因此您也可以执行以下操作:

$items = Item::with(['categoryItems' => function($q1){
    $q1->join('Categories','category_id','=','categories.id')
    ->orderBy('name','DESC'); // name here is the cat name
}])->orderBy('name','DESC'); // name here is the item name

相关问题