169 похожих чатов

Подскажите, есть ли какой-то легкий способ, получить hasOneThrough через 2

таблицы?
Например, предположим, что в примере из доки есть еще сверху таблица с фирмами(компаниями) 'companies', которая выглядит так:
companies:
id - integer
name - string

а в таблице механиков дополнена связью с фирмами
mechanics:
id - integer
name - string
company_id - integer

Есть ли способ сделать в Owner доступ к Компании типа так:
public function company(): HasOneThrough
{
return $this->hasOneThrough(Company::class, [Car::class, Mechanic::class]);
}

Видел в сети вроде какой-то пакет есть для этого, но не охота его ставить пока что. Может есть какие-то удобные штатные средства, не описанные в доке?
🤔

28 ответов

105 просмотров

попробуй типа public function company(): BelongsTo { return $this->car->mechanic->company(); } при условии что все связи описаны

только пакетом

Vladyslav
такое не заработает)

у меня работает, просто через 1 а не через 2

Serhii Dorn
у меня работает, просто через 1 а не через 2

ну не знаю, как то оно страшно выглядит

DevilSAM- Автор вопроса
Serhii Dorn
у меня работает, просто через 1 а не через 2

у меня тоже так работает через 2 связи. Не совсем релэйшен, конечно, но мне пойдет 😅 return Company::find($owner->car?->mechanic?->company_id)

DevilSAM- Автор вопроса
Vladyslav
фуфуфу

да мне надо это один раз в одном месте вывести )) не, это не внутри модели. Это уже по коду, где выводить надо

DevilSAM- Автор вопроса

это надо company() иметь внутри Owner. А что я там могу предложить?

DevilSAM
это надо company() иметь внутри Owner. А что я там...

public function company(): BelongsTo { return $this->car->mechanic->company(); }

DevilSAM- Автор вопроса
Serhii Dorn
public function company(): BelongsTo { ...

кстати, работает! ⚡️

Serhii Dorn
public function company(): BelongsTo { ...

Плохая реализация. Здесь нужно оставить релейшен в car, далее в модели car релейшен на механика, а в модели механика - на компанию. Снаружи используется жадная загрузка: with('car.mechanic.company') И, в том числе, избавляемся от проблемы N+1 в запросах.

DevilSAM- Автор вопроса
Andrey Helldar
Плохая реализация. Здесь нужно оставить релейшен в...

а разве with() не вернем нам билдер вместо релейшена?

DevilSAM
а разве with() не вернем нам билдер вместо релейше...

Сам метод возвращает билдер, а вот результат запроса будет содержать загруженные релейшены

DevilSAM- Автор вопроса
Andrey Helldar
Сам метод возвращает билдер, а вот результат запро...

а... предлагается не писать релейшен для модели owner, а просто использовать жадную загрузку для получения данных.

DevilSAM
а... предлагается не писать релейшен для модели ow...

Жадная загрузка загружает релейшены. Не писать их невозможно

DevilSAM- Автор вопроса
Andrey Helldar
Жадная загрузка загружает релейшены. Не писать их ...

я имею ввиду конкретный релейшен company для модели owner. все остальные релейшены, конечно, остаются

DevilSAM- Автор вопроса
Andrey Helldar
Жадная загрузка загружает релейшены. Не писать их ...

то есть return Owner::with('car.machanic.company')->find($owner->id)?->car?->machanic?->company лучше чем return Company::find($owner->car?->mechanic?->company_id)

DevilSAM
то есть return Owner::with('car.machanic.company')...

а зачем делать Owner::find('$owner->id') ?)

DevilSAM
то есть return Owner::with('car.machanic.company')...

Зачем грузить овнера, если уже есть его модель? $owner->car->mechanic->company

DevilSAM- Автор вопроса
Andrey Helldar
Зачем грузить овнера, если уже есть его модель? $...

так... я не успеваю )) чем вот это лучше того, что было изначально?

DevilSAM- Автор вопроса
DevilSAM
так... я не успеваю )) чем вот это лучше того, чт...

ленивая загрузка нужна при массовой загрузке записей, ->get()

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
1
Он в одиночку это дело запилил или была какая-то команда?
Aquinary
12
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Всем привет, нужна как никогда, нужна помощь с IO в загрузчике. Пишу в code16 после установки сегментных регистров, пишу вывод символа. Пробовал 2 варианта: # 1 mov $0x0E, %a...
Shadow Akira
14
Карта сайта