Laravel - извлекает только строки для родительского отношения во вложенном whereHas - PullRequest
0 голосов
/ 26 октября 2018

У меня есть 3 модели с отношениями. Там отношения такие:

Sites
Tenancies
Tenants

1 site can have many tenancies
1 tenancy can have 1 tenant

Я получаю коллекцию всех арендаторов для этого сайта, используя отношения hasManyThrough, подобные этому

public function tenants(){
    return $this->hasManyThrough(
        'App\Models\Tenants\Tenants',
        'App\Models\Tenancies\Tenancies',
        'site_id', // Foreign key on Tenancies table...
        'id', // Foreign key on invoices table...
        'id', // Local key on tenants table...
        'linked_tenant_id' // Local key on tenancies table...
    )->distinct();
}

А потом получаю только активные аренды, как это

public function activeTenancies(){
    return $this->hasMany('App\Models\Tenancies\Tenancies', 'linked_tenant_id', 'id')->where('active',1);
}

И затем называя это так

    $sites = Sites::whereHas('tenants')->with(['tenants' => function($query){
        $query->whereHas('activeTenancies')->with('activeTenancies');
    }]);

Это прекрасно работает, если я затем ввожу коллекцию, он возвращает только сайты с активными арендаторами, а затем возвращает арендаторов вместе с ним.

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

Допустим, у меня есть арендатор по имени FakeComp, и предположим, что у FakeComp есть договоры аренды как с сайтом 1, так и с сайтом 2, как это.

Site - 1
Tenancy - TenancyABC
Tenant - FakeComp

Site - 2
Tenancy - TenancyBCA
Tenant - FakeComp

Когда я зацикливаю свои сайты и арендаторов, так как «FakeComp» арендует и сайт 1, и сайт 2, он возвращается следующим образом

Site - 1
  |
  |-----> Fake Comp
              |
              |---------> TenancyABC
              |---------> TenancyBCA

Site - 2
  |
  |-----> Fake Comp
              |
              |---------> TenancyABC
              |---------> TenancyBCA

Вместо того, чтобы получать только аренду для этого сайта, как это

Site - 1
  |
  |-----> Fake Comp
              |
              |---------> TenancyABC

Site - 2
  |
  |-----> Fake Comp
              |
              |---------> TenancyBCA

FakeComp захватывается обоими сайтами, потому что он имеет право аренды обоих сайтов. Но тогда вместо того, чтобы только захватить аренду для этого сайта, он захватывает все свои аренды.

Как получить ТОЛЬКО права аренды для этого сайта? Извините, если это сбивает с толку, это довольно сложно объяснить.

1 Ответ

0 голосов
/ 26 октября 2018

Кажется, что у вас есть site_id в таблице tenancies, я предполагаю, что это относится к идентификатору в таблице sites, так что вы можете просто добавить отношение на вашей Site модели кTenancy (простое hasOne или hasMany, если у сайта может быть несколько арендаторов).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...