Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 25.08.2021 21:08:43

Не понимаю ORM, зная при этом SQL, может готовить не умею?

Упростил реальную задачу из жизни, выкинув ненужные связи и свёл до двух таблиц.

Есть 2 таблицы: carriers и vehicles. carriers - главная, vehicles соподчинённая, соединены отношением один ко многим.
Поля в carriers: id, name, user_id (внешний ключ на третью страницу). Поля в vehicles: id, name, carrier_id

Мне нужно получить их произведение.

В SQL делаю запрос:

select 
  v.*, c.name as carrier_name
from 
  vehicles v
join 
  carriers c on c.id = v.carrier_id
where 
  c.user_id = 2
order by c.name, v.id

На выходе 9 штук.

Переписать код в Query Bilder я могу, но не вижу смысла.

Интересует, как подобные объединения получать в ORM?

Я пытался сделать вот так:

$vehicle-> Vehicle::with(['carrier'=>function(BelongsTo $query){
   $query->where('user_id', '=', '1');
Ъ])
->orderBy('id')->get();

Но в результате я получаю все записи из таблицы vehicles. Как ограничить выборку только теми значениями, что мне нужны?

Спасибо!

Не в сети

#2 27.08.2021 08:07:17

Re: Не понимаю ORM, зная при этом SQL, может готовить не умею?

Пиши́те почти также как на сыром SQL:

$vehicles = Vehicle::join('carriers as c', 'c.id', '=', 'vehicles.carrier_id')
    ->where('c.user_id', '=', '1');
    ->orderBy('c.name')
    ->orderBy('vehicles.id')
    ->select('vehicles.*', 'c.name as carrier_name')
    ->get();

Eloquent это конечно ORM, но слабенький smile


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Не в сети

#3 27.08.2021 08:11:49

Re: Не понимаю ORM, зная при этом SQL, может готовить не умею?

Да с сырым SQL понятно, хочется просто разобраться с этим зверем. В общем-то я задачу решил, причём двумя способами. Первый оказался клуджем. Работает, но в теории не должен smile Второй сделал точно по теории, но всё-таки пришлось использовать join. Я хотел попрактиковать именно отказ от джойнов, но, оказывается, не для всех задач это возможно.

Не в сети

Подвал раздела