laravel - 雄辩的范围 - 所有项目不是其他表中的 FK
问题描述
首先,了解我在创建查询范围时遇到的困难的一些背景知识。
这是我的架构的一部分:
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:无法更改型号
解决方案
您可以在范围方法中构建查询。
以下代码有效..
建立.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/
推荐阅读
- discord.js - 反正有没有将图像标记为剧透?
- c# - 无法在触发器 wpf 中设置样式
- javascript - 如何在循环中推送对象数组中的值?
- ios - SWIFT - 在一天中的特定时间调用函数
- bash - 更改变量值并将其存储到另一个变量中
- c++ - 在 C++11 中按值返回构造对象时避免复制构造函数调用
- spring-data-jpa - Spring JPA findByColumnNameLike 不起作用
- c# - 选择不等待 ASP.NET Core WebAPI 控制器中的异步函数
- java - Java:实现树及其节点的并行层次结构
- google-cloud-firestore - 每个数据库的移动设备 Cloud Firestore 并发连接限制和每个数据库每秒的最大写入次数