Красноречивый контекст - все предметы не ФК в другой таблице - PullRequest
0 голосов
/ 08 ноября 2019

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

Вот часть моей схемы:

Structure
 - id
 - head_office_id

Establishment
 - id
 - structure_id

Вот как определяются отношения вмои модели

class Structure {    
    public function head_office(): BelongsTo
    {
        return $this->belongsTo(Establishment::class, 'head_office_id');
    }

    public function establishments(): HasMany
    {
        return $this->hasMany(Establishment::class);
    }

}

class Establishment {
    public function structure(): BelongsTo
    {
        return $this->belongsTo(Structure::class);
    }
}

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

Establishment::notHeadOffice()->get()

Например:

Structures

id | head_office_id
1  | null
2  | 3

Establishments

id | structure_id
1  | 1
2  | 1
3  | 2
4  | 2
5  | 2

В этом случае сфера должна вернуть все заведения , но номер 3 (поскольку предприятие 3 связано со структурой 2 и является головным офисом этой структуры)

Я пробовал несколько вещей, но это выходит за рамки моих знаний о построителе запросов.

Есть какие-нибудь подсказки?

PS: модель не может быть изменена

1 Ответ

1 голос
/ 08 ноября 2019

Вы можете построить запрос в области видимости.

Следующий код работает ..

Establishment.php

namespace App;

use Illuminate\Database\Eloquent\Model;
use DB;

class Establishment extends Model
{

    public function scopeNotHeadOffice($query)
    {
        return $query->whereNotExists(function ($qry) {
            $qry->select(DB::raw(1))
                ->from('structures')
                ->whereRaw('structures.head_office_id = establishments.id');
        });
    }

    public function structure(): BelongsTo
    {
        return $this->belongsTo(Structure::class);
    }
}

Контроллер

Establishment::notHeadOffice()->get();

Ссылки:

Laravel WhereExists - https://laravel.com/docs/6.x/queries#where-exists-clauses

Laravel WhereNotExists- https://stackoverflow.com/a/38575266

MySQL Существует - http://www.mysqltutorial.org/mysql-exists/

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