Size: a a a

Laravel для начинающих

2020 February 27

AP

Alexander Pavlenko 🌚 in Laravel для начинающих
Игорь
Да, вот именно это и смущает. Может быть Product?
надумал чет?)
источник

AH

Andrey Helldar in Laravel для начинающих
Игорь
В магазине есть категории сахар,  овощи, фрукты. Я хочу их выводить в определенном порядке. Для этого вывожу поле order. по нему сортирую и все.

Админ это может делать. Не суть. Как будет выглядеть запрос и какой это будет метод put?
В общем, я вижу несколько вариантов:

1. Сортировка только при выводе реализуется путем передачи GET-параметра.
Например:
GET /categories?sort=title&direction=desc

function index(Request $request)
{
 return Category::query()
   ->orderBy(
     $request->query('sort', 'title'),
     $request->query('direction', 'desc')
   )
   ->get();
}

2. Сохранение сортировки в базу лучше вынести в отдельный урл.
Как нам известно, правильно будет для обновления использовать запрос PUT.
Теперь преобразуем список роутов с очевидным поведением:

GET /api/categories
POST /api/categories
PUT /api/categories/order
GET /api/categories/1
PUT/PATCH /api/categories/1
PUT /api/categories/1/order
DELETE /api/categories/1

Здесь мы добавили роуты с суффиксом order для очевидного принятия поведения сортировки.
Таким образом, в запросе можно передать массив идентификаторов для обновления.
Например:
$ids = [15, 43, 65, 3, 34, 56, 5, 765, 2];

foreach ($ids as $sort => $id) {
 Category::where(...)->update(compact('sort'));
}
источник

AH

Andrey Helldar in Laravel для начинающих
Max
Имеется ввиду как в самой БД реализовать
Так и реализовать. Поля идентификаторов для них пропиши
https://laravel.com/docs/6.x/eloquent-relationships#many-to-many
источник

SG

Sergey Gerasimov in Laravel для начинающих
Andrey Helldar
В общем, я вижу несколько вариантов:

1. Сортировка только при выводе реализуется путем передачи GET-параметра.
Например:
GET /categories?sort=title&direction=desc

function index(Request $request)
{
 return Category::query()
   ->orderBy(
     $request->query('sort', 'title'),
     $request->query('direction', 'desc')
   )
   ->get();
}

2. Сохранение сортировки в базу лучше вынести в отдельный урл.
Как нам известно, правильно будет для обновления использовать запрос PUT.
Теперь преобразуем список роутов с очевидным поведением:

GET /api/categories
POST /api/categories
PUT /api/categories/order
GET /api/categories/1
PUT/PATCH /api/categories/1
PUT /api/categories/1/order
DELETE /api/categories/1

Здесь мы добавили роуты с суффиксом order для очевидного принятия поведения сортировки.
Таким образом, в запросе можно передать массив идентификаторов для обновления.
Например:
$ids = [15, 43, 65, 3, 34, 56, 5, 765, 2];

foreach ($ids as $sort => $id) {
 Category::where(...)->update(compact('sort'));
}
Эм... не очень
источник

SG

Sergey Gerasimov in Laravel для начинающих
Andrey Helldar
В общем, я вижу несколько вариантов:

1. Сортировка только при выводе реализуется путем передачи GET-параметра.
Например:
GET /categories?sort=title&direction=desc

function index(Request $request)
{
 return Category::query()
   ->orderBy(
     $request->query('sort', 'title'),
     $request->query('direction', 'desc')
   )
   ->get();
}

2. Сохранение сортировки в базу лучше вынести в отдельный урл.
Как нам известно, правильно будет для обновления использовать запрос PUT.
Теперь преобразуем список роутов с очевидным поведением:

GET /api/categories
POST /api/categories
PUT /api/categories/order
GET /api/categories/1
PUT/PATCH /api/categories/1
PUT /api/categories/1/order
DELETE /api/categories/1

Здесь мы добавили роуты с суффиксом order для очевидного принятия поведения сортировки.
Таким образом, в запросе можно передать массив идентификаторов для обновления.
Например:
$ids = [15, 43, 65, 3, 34, 56, 5, 765, 2];

foreach ($ids as $sort => $id) {
 Category::where(...)->update(compact('sort'));
}
Разве /api/categories/1/order не должно управлять одной моделью?
источник

AH

Andrey Helldar in Laravel для начинающих
Sergey Gerasimov
Разве /api/categories/1/order не должно управлять одной моделью?
Должно - для записей внутри одной категории
источник

AH

Andrey Helldar in Laravel для начинающих
PUT /api/categories/order обновляет сортировку самих категорий, а PUT /api/categories/1/order - для записей внутри этой категории, будь то подкатегории или список товаров.
источник

SG

Sergey Gerasimov in Laravel для начинающих
Andrey Helldar
Должно - для записей внутри одной категории
А ты меняешь в рамках всего списка...
источник

AH

Andrey Helldar in Laravel для начинающих
Sergey Gerasimov
А ты меняешь в рамках всего списка...
Ему же и надо весь список в определенных рамках изменить...
источник

SG

Sergey Gerasimov in Laravel для начинающих
Andrey Helldar
Ему же и надо весь список в определенных рамках изменить...
Ну судя по массиву $ids - где есть 1, то это уровень сестринский
источник

AH

Andrey Helldar in Laravel для начинающих
Sergey Gerasimov
Ну судя по массиву $ids - где есть 1, то это уровень сестринский
Не понял сути твоей претензии.

В своем примере предложил два варианта обновления: списка самих категорий и то, что внутри них.

Сами категории обновляются по PUT /api/categories/order.

То, что внутри них, будь то подкатегории или же какие-либо записи, обновляются по  PUT /api/categories/1/order, где 1 - это идентификатор нужной категории, внутри которой необходимо произвести действия.
источник

AH

Andrey Helldar in Laravel для начинающих
Sergey Gerasimov
Разве /api/categories/1/order не должно управлять одной моделью?
Одной моделью управляет PUT/PATCH /api/categories/1
А нам нужна сортировка списка элементов внутри этой модели. Следовательно, PUT /api/categories/1/order идеально вписывается в эту концепцию.
источник

И

Игорь in Laravel для начинающих
Andrey Helldar
Одной моделью управляет PUT/PATCH /api/categories/1
А нам нужна сортировка списка элементов внутри этой модели. Следовательно, PUT /api/categories/1/order идеально вписывается в эту концепцию.
Не вписывается
источник

И

Игорь in Laravel для начинающих
Почему 1?
источник

И

Игорь in Laravel для начинающих
Мы же не одну категорию меняем. А сразу все, обварачивая в транзакцию
источник

AH

Andrey Helldar in Laravel для начинающих
Игорь
Почему 1?
1, 6, 567, 3456, my-product - какая разница что указывать в блоке "например"?
источник

И

Игорь in Laravel для начинающих
Alexander Pavlenko 🌚
продукт тоже так себе
Согласен. Но пока больше в голову не идет
источник

AH

Andrey Helldar in Laravel для начинающих
Игорь
Мы же не одну категорию меняем. А сразу все, обварачивая в транзакцию
Там два урла в блоке примера ;)
источник

AH

Andrey Helldar in Laravel для начинающих
Вы как-то ограниченно видите одну строчку из нескольких и за нее цепляетесь...
источник

AH

Andrey Helldar in Laravel для начинающих
Вот этот, почему-то, и ты, и Сергей, упускаете из вида, а, ведь, я писал про оба варианта...
источник