#php #laravel #laravel-8
Вопрос:
У меня есть приложение, в котором пользователи могут управлять своими свойствами и арендой.
Это определенные отношения:
//Team.php
/**
* A team can have many properties.
*/
public function properties():
{
return $this->hasMany(Property::class);
}
//Property.php
/**
* A property can have many leases.
*/
public function leases():
{
return $this->hasMany(Lease::class);
}
Как вы можете видеть здесь, у команды может быть много объектов недвижимости, и у каждого объекта недвижимости также может быть много договоров аренды.
Я пытаюсь понять, как я могу получить количество договоров аренды, связанных с командой:
$team = Auth::user()->currentTeam;
return $team->properties->leases->count();
Однако приведенный выше код возвращает ошибку:
Свойство [аренда] не существует в этом экземпляре коллекции.
Комментарии:
1. Вам нужно выполнить итерацию
properties
; это наборProperty
экземпляров, поэтому вызов->properties->leases
не будет работать, так как он не знает, на которыйproperty->leases
вы ссылаетесь. ЕстьhasManyThrough()
, но это не работает для вложенныхmany-to-many
, ноhasManyDepp()
через этот пакет работает.2. @TimLewis Прочитав немного больше об
hasManyThrough
этом, я действительно верю, что могу использовать его на самом деле. (Смотрите мой предложенный ответ)3. Мило! Я немного неправильно истолковал ваш вопрос, у вас не совсем гнездо
many-to-many
, как я изначально думал, у вас есть вложенныеone-to-many
(одна команда -> много свойств ->> много договоров аренды), так что >>hasManyThrough
на самом деле должно работать просто отлично здесь. Рад, что у тебя все получилось, несмотря ни на что!
Ответ №1:
Вы можете добавить этот метод в свой Team.php
:
public function leasesCount(){
return count(
Team::
join('properties', 'properties.team_id', '=', 'teams.id')
->join('leases', 'leases.property_id', '=', 'properties.id')
->where('teams.id', $this->id)
->get()
);
}
Ответ №2:
В итоге я использовал hasManyThrough
отношения в Team
модели, вот так:
//Team.php
/**
* Get all of the leases for the team.
*/
public function leases()
{
return $this->hasManyThrough(Lease::class, Property::class);
}
Тогда я могу просто получить количество договоров аренды, созданных определенной командой, с помощью:
return $team->leases()->count();