Laravel OrderBy в данных отношений - PullRequest
0 голосов
/ 27 марта 2020

Как заказать в коллекции отношений для вывода grocery.name? Теперь он просто сортируется по родительскому идентификатору по умолчанию, что меня не интересует.

Я пытался изменить этот контроллер ...

Вот так это выглядело

public function indexalpha()
    {
        $list = DailyList::with('grocery')->where('completed', 0)->get();
        return $list;
    }

И это мои изменения, где я хочу изменить имя grocery.name для вывода его в алфавитном порядке

public function indexalpha()
    {
        $list = DailyList::with(['grocery' => function ($q) {
            $q->orderBy('name', 'desc');
        }])->where('completed', 0)->get();
        return $list;
    }

Мой вывод выглядит так, как если бы он был по идентификатору

[
{
"id": 554, // this is apparently the default sorting
"grocery_id": 110,
"amount": 1,
"completed": 0,
"created_at": "2020-03-27 08:29:53",
"updated_at": "2020-03-27 08:29:53",
"grocery": {
  "id": 110,
  "name": "Cookie", // Want to order this part!!!
  "measurement": "Stk",
  "created_at": "2020-02-20 12:25:26",
  "updated_at": "2020-02-20 12:25:26"
}
},
{
"id": 555, // this is apparently the default sorting
"grocery_id": 107,
"amount": 1,
"completed": 0,
"created_at": "2020-03-27 08:51:10",
"updated_at": "2020-03-27 08:51:10",
"grocery": {
  "id": 107,
  "name": "Pampers", // Want to order this part!!!
  "measurement": "Stk",
  "created_at": "2020-01-27 13:50:24",
  "updated_at": "2020-01-27 13:50:24"
}
}
]

Структура моей таблицы

Groceries
- id
- name
- measurement

Отношение в модели

class DailyList extends Model
{


    public function grocery()
    {
        return $this->belongsTo(Grocery::class);
    }
}

Ответы [ 2 ]

0 голосов
/ 27 марта 2020

Начиная с laravel 6 и далее, вы можете сделать это с более чистым синтаксисом

https://laravel-news.com/eloquent-subquery-enhancements

$list = DailyList::with('grocery')->orderByDesc(
    ProductPrice::select('name')
        ->whereColumn('daily_lists.grocery_id', 'groceries.id')
        ->orderByDesc('name')
        ->limit(1)
)->where('completed', 0)->get();
0 голосов
/ 27 марта 2020

Вы только заказываете продукты. Чтобы заказать ежедневные списки, вам нужно будет сделать код SQL, чтобы исправить это.

DailyList::leftJoin('groceries', 'daily_lists.grocery_id', 'groceries.id')
    ->orderBy('groceries.name')
    ->with('grocery')
    ->where('completed', 0)
    ->select('groceries.*')
    ->get();

Вы включаете продуктовый элемент, если он есть, с левым соединением. Затем у вас есть этот ряд, в том числе в ваших данных, вы можете заказать продукты. Чтобы не связываться с сопоставлениями Laravel ORM, выбирайте только продукты.

...