Laravel - Eloquent 查询未通过 'with' 返回关系
Laravel - Eloquent query not returning relation via 'with'
我有以下查询应该 return 关系但不是。
涉及的模型有Person和Role。
Person 关系:
public function roles()
{
return $this->belongsToMany(Role::class, 'person_role', 'user_id', 'role_id')
->where('person_role.org_id', $this->defaultOrgID);
}
角色关系:
public function people()
{
return $this->belongsToMany(Person::class, 'person_role','role_id', 'user_id');
}
麻烦的查询:
$persons = Person::with('roles')
//->selectRaw('person.personID, person.lastName, person.firstName, person.login, op.OrgStat1, person.defaultOrgID')
->select('person.personID', 'person.lastName', 'person.firstName', 'person.login', 'op.OrgStat1', 'person.defaultOrgID')
->leftJoin('person-email as pe', 'pe.personID', '=', 'person.personID')
->leftJoin('org-person as op', 'op.personID', '=',
DB::raw('person.personID and op.orgID = ' . $this->currentPerson->defaultOrgID))
->leftJoin('role_user as ru', 'ru.user_id', '=',
DB::raw('person.personID AND ru.orgID = ' . $this->currentPerson->defaultOrgID .
' AND EXISTS (select roles.name from roles where roles.id = ru.role_id and roles.name ="%' . $query . '%")'))
->orWhere(function ($q) use ($query) {
$q->orWhere('person.firstName', 'LIKE', "%$query%")
->orWhere('person.lastName', 'LIKE', "%$query%")
->orWhere('person.login', 'LIKE', "%$query%")
->orWhere('person.personID', 'LIKE', "%$query%")
->orWhere('pe.emailADDR', 'LIKE', "%$query%")
->orWhere('op.OrgStat1', 'LIKE', "%$query%");
})->distinct()->get();
我已经使用 tinker 进行了测试,并且可以验证在抓取 Person 记录和使用 $p->roles 时关系是否按预期工作。
上面的查询return在应该有数据的时候为空。我担心这可能是由于 select 查询引起的,但找不到任何表明这是否是问题所在以及如何补救的信息。
编辑
使用 dd(DB::getQueryLog()),我可以看到为 with 子句生成的查询要求在枢轴 table 上添加一个额外字段(这是必需的),但要求它的值为无效的。如果它没有从 Person 中的关系定义中获取,我该如何指定它应该是什么?
生成的查询:
"query" => "select `roles`.*, `person_role`.`user_id` as `pivot_user_id`, `person_role`.`role_id` as `pivot_role_id` from `roles` inner join `person_role` on `roles`.`id` = `person_role`.`role_id` where `person_role`.`org_id` is null and `person_role`.`user_id` in (1) ◀"
我可以验证 $this->defaultOrgID 确实有一个非空值,该值在 Person 的 roles() 关系函数中被引用。
我偶然发现 this question 并在那里实施了解决方案 - 以描述的方式创建自定义数据透视模型,它似乎提供了预期的数据。
我仍然不知道为什么我可以在使用 tinker 时得到我期望的结果,但在应用程序本身却得不到。
我有以下查询应该 return 关系但不是。
涉及的模型有Person和Role。
Person 关系:
public function roles()
{
return $this->belongsToMany(Role::class, 'person_role', 'user_id', 'role_id')
->where('person_role.org_id', $this->defaultOrgID);
}
角色关系:
public function people()
{
return $this->belongsToMany(Person::class, 'person_role','role_id', 'user_id');
}
麻烦的查询:
$persons = Person::with('roles')
//->selectRaw('person.personID, person.lastName, person.firstName, person.login, op.OrgStat1, person.defaultOrgID')
->select('person.personID', 'person.lastName', 'person.firstName', 'person.login', 'op.OrgStat1', 'person.defaultOrgID')
->leftJoin('person-email as pe', 'pe.personID', '=', 'person.personID')
->leftJoin('org-person as op', 'op.personID', '=',
DB::raw('person.personID and op.orgID = ' . $this->currentPerson->defaultOrgID))
->leftJoin('role_user as ru', 'ru.user_id', '=',
DB::raw('person.personID AND ru.orgID = ' . $this->currentPerson->defaultOrgID .
' AND EXISTS (select roles.name from roles where roles.id = ru.role_id and roles.name ="%' . $query . '%")'))
->orWhere(function ($q) use ($query) {
$q->orWhere('person.firstName', 'LIKE', "%$query%")
->orWhere('person.lastName', 'LIKE', "%$query%")
->orWhere('person.login', 'LIKE', "%$query%")
->orWhere('person.personID', 'LIKE', "%$query%")
->orWhere('pe.emailADDR', 'LIKE', "%$query%")
->orWhere('op.OrgStat1', 'LIKE', "%$query%");
})->distinct()->get();
我已经使用 tinker 进行了测试,并且可以验证在抓取 Person 记录和使用 $p->roles 时关系是否按预期工作。
上面的查询return在应该有数据的时候为空。我担心这可能是由于 select 查询引起的,但找不到任何表明这是否是问题所在以及如何补救的信息。
编辑 使用 dd(DB::getQueryLog()),我可以看到为 with 子句生成的查询要求在枢轴 table 上添加一个额外字段(这是必需的),但要求它的值为无效的。如果它没有从 Person 中的关系定义中获取,我该如何指定它应该是什么?
生成的查询:
"query" => "select `roles`.*, `person_role`.`user_id` as `pivot_user_id`, `person_role`.`role_id` as `pivot_role_id` from `roles` inner join `person_role` on `roles`.`id` = `person_role`.`role_id` where `person_role`.`org_id` is null and `person_role`.`user_id` in (1) ◀"
我可以验证 $this->defaultOrgID 确实有一个非空值,该值在 Person 的 roles() 关系函数中被引用。
我偶然发现 this question 并在那里实施了解决方案 - 以描述的方式创建自定义数据透视模型,它似乎提供了预期的数据。
我仍然不知道为什么我可以在使用 tinker 时得到我期望的结果,但在应用程序本身却得不到。