Laravel 雄辩的范围-其他表中不包含FK的所有项目

Laravel 雄辩的范围-其他表中不包含FK的所有项目,laravel,eloquent,Laravel,Eloquent,首先,了解一下创建查询范围的区别 以下是我的模式的一部分: Structure - id - head_office_id Establishment - id - structure_id 下面是如何在我的模型中定义关系 class Structure { public function head_office(): BelongsTo { return $this->belongsTo(Establishment::class, 'h

首先,了解一下创建查询范围的区别

以下是我的模式的一部分:

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:模型无法更改

您可以在范围方法中生成查询

下面的代码有效

restitution.php

控制器

参考资料:

若存在,则为Laravel-

不存在的Laravel-


MySQL存在-

测试通过!谢谢。
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();