OneCode ЧАТ
Открыть в Telegram
Общаемся на тему веб-разработки. HTML, CSS, JS, VueJS, NuxtJS, PHP, Laravel, MySQL, PostgreSQL. Разрешено: - Задавать вопросы. - Отвечать на вопросы. - Делиться своим опытом. Запрещено: - Нецензурные выражения. - Спам, реклама, фл
БольшеСтрана не указанаКатегория не указана
485
Подписчики
Нет данных24 часа
Нет данных7 дней
Нет данных30 дней
Архив постов
485
Правда все равно не понимаю десктопные маки, а-ля мак про и т.п. За такие цены можно собрать офигенный ПК на вин
485
Всем привет!
По своему ночному вопросу породил еще два варианта решения. Может кому интересным окажется, как можно Relations расширить, если чего-то им не хватает.
Если коротко, то у меня Пользователь (
User с таблицей users). У него много договоров(UserContracts с таблицей user_contracts). У договоров есть текущее состояние баланса и так архитектурно получилось, что они в другой таблице user_contract_balances. Я пытался обойтись без двух уровней отношений. Вот что получилось слепить:
Вариант 1. Просто к hasMany добавить ->join и подтянуть таблицу user_contract_balances к user_contracts. Дальше там можно ->select сделать и указать нужные поля, но по умолчанию ЗВЁЗДОЧКА идёт и я пока так и оставил. В итоге поле balance как бы попадает в UserContract
public function contracts(): HasMany
{
return $this->hasMany(UserContract::class)
->join('user_contract_balances', 'id', '=', 'user_contract_id');
}
получился такой запрос:
select * from user_contracts inner join user_contract_balances on id = user_contract_id where user_contracts.user_id = ? and user_contracts.user_id is not nullВариант 2. Мне меньше нравится, так как для баланса пришлось делать еще одну модель
UserContractBalance, а не хотелось. Тут пользуемся hasManyThrough и как бы от User'a ломимся к UserContractBalance, но через UserContract. В результате этого получаем коллекцию UserContractBalance, но за счёт уточняющего селекта добавляем все поля из user_contracts, а эти поля на самом деле в запросе уже доступны. Тут Немного конечно не логично что поля от UserContract пихаем в UserContractBalance, а должно быть наоборот, но своё дело делает = данные доступны.
public function contracts(): HasManyThrough
{
return $this->hasManyThrough(UserContractBalance::class, UserContract::class)
->select('user_contracts.*', 'user_contract_balances.balance');
}
получился такой запрос:
select
user_contracts.*,
user_contract_balances.balance,
user_contracts.user_id as laravel_through_key
from user_contract_balances
inner join user_contracts on user_contracts.id = user_contract_balances.user_contract_id
where user_contracts.user_id = ?485
Вы были правы) я поменял в миграциях название таблицы там, где таблица создавалась, но забыл поменять там, где таблица удалялась.
