OneCode ЧАТ
Open in Telegram
Общаемся на тему веб-разработки. HTML, CSS, JS, VueJS, NuxtJS, PHP, Laravel, MySQL, PostgreSQL. Разрешено: - Задавать вопросы. - Отвечать на вопросы. - Делиться своим опытом. Запрещено: - Нецензурные выражения. - Спам, реклама, фл
Show moreThe country is not specifiedThe category is not specified
485
Subscribers
No data24 hours
No data7 days
No data30 days
Posts Archive
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
Вы были правы) я поменял в миграциях название таблицы там, где таблица создавалась, но забыл поменять там, где таблица удалялась.
