【发布时间】:2016-07-29 18:30:50
【问题描述】:
我正在处理以下情况:我有两个模型,一个带有 id 和 name 字段的 Employee 和带有 id、employee_id 和 flag 字段的 Telephone。这两种模型之间也存在一对多的关系,即一个员工可能有很多部电话,而一部电话可能属于一个员工。
class Employee extends Model
{
public function telephones()
{
return $this->hasMany(Telephone::class);
}
}
class Telephone extends Model
{
public function employee()
{
return $this->belongsTo(Employee::class);
}
}
Employee 模型引用存在于名为 mydb1 的数据库架构中的表 employees,而 Telephone 模型与存在于名为 mydb2 的不同数据库架构中的 telephones 表相关。
我想要的是只获取具有特定标志热切加载的至少一部电话的员工,使用 Eloquent并且(如果可能)不是查询生成器
到目前为止我尝试没有成功的是:
1) 在Controller中使用whereHas方法
$employees = Employee::whereHas('telephones', function ($query) {
$query->where('flag', 1); //Fetch only the employees with telephones of flag=1
})->with([
'telephones' => function ($query) { //Eager load only the telephones of flag=1
$query->where('flag', 1);
}
])->get();
我在这里尝试做的是首先仅检索具有 flag=1 的电话的员工,然后仅急切加载这些电话,但由于不同使用的数据库连接:
未找到基表或视图:表 mydb1.telephones 不存在(这是真的,电话存在于 mydb2 中)
2) 控制器中带有约束的急切负载
$employees = Employee::with([
'telephones' => function ($query) {
$query->where('flag', 1);
},
])->get();
这个方法用 flag=1 急切地加载电话,但它返回 all 员工实例,这不是我真正想要的。我想收集只有有电话的员工模型,flag = 1,不包括带有telephones = [] 的模型
【问题讨论】:
-
只是一个建议,但也许您可以在合并
employees和telephones的数据库中创建view,然后从代码中的视图中提取。还有see discussion on linking databases in MySQL. -
你是否设置了受保护的 $connection = 'mydb2';手机型号?
-
@Froxz 是的,但不幸的是 whereHas() 没有考虑到它
标签: mysql laravel eloquent eager-loading relationships