Laravel — Получение количества вложенных отношений

#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();