php - 工会中的Laravel关系冲突
问题描述
我有以下模型:1-用户模型
/**
* Define user and functional area relationship
*/
public function functionalAreas()
{
return $this->belongsToMany('App\FunctionalArea', 'user_functional_areas', 'user_id', 'functional_area_id')->withPivot('id', 'is_primary')->withTimestamps();
}
和商业模式:
/**
* Define business and user functional area relationship
*/
public function functionalAreas()
{
return $this->belongsToMany('App\FunctionalArea', 'business_functional_areas', 'business_id', 'functional_area_id')->withTimestamps();
}
现在我应该将所有企业和用户显示在一个列表中,为此我从联合中使用,以下是我的查询:
public function usersAndOrganizations()
{
$users = $this->users();
$organizations = $this->organizations();
$invitees = $users->union($organizations)->paginate(10);
return response()->json($invitees);
}
private function users()
{
$users = User::byState($approved = true, 'is_approved')
->search()->select([
'id',
DB::raw("CONCAT(first_name, ' ', last_name) AS name"),
'about',
'address',
'slug',
'average_reviews',
DB::raw("'freelancer' AS type")
]);
$users = $users->with([
"functionalAreas" => function ($q) {
$q->select([
'functional_areas.id',
DB::raw("functional_areas.name_en AS name"),
]);
}
]);
return $users;
}
private function organizations()
{
$businesses = Business::where('owner_id', '!=', auth()->user()->id)->verified()
->active()->search()
->select([
'id',
'name',
'about',
'address',
'slug',
'average_reviews',
DB::raw("'business' AS type")
]);
$businesses = $businesses
->with([
"functionalAreas" => function ($q) {
$q->select([
'functional_areas.id',
DB::raw("functional_areas.name_en AS name"),
]);
}
]);
return $businesses;
}
但是上面的查询没有返回业务功能区域,它的输出查询使用来自用户关系而不是业务,该with
部分生成两次以下查询:
select
`functional_areas`.`id`,
functional_areas.name_en AS name,
`user_functional_areas`.`user_id` as `pivot_user_id`,
`user_functional_areas`.`functional_area_id` as `pivot_functional_area_id`,
`user_functional_areas`.`id` as `pivot_id`,
`user_functional_areas`.`is_primary` as `pivot_is_primary`,
`user_functional_areas`.`created_at` as `pivot_created_at`,
`user_functional_areas`.`updated_at` as `pivot_updated_at`
from `functional_areas`
inner join `user_functional_areas`
on `functional_areas`.`id` = `user_functional_areas`.`functional_area_id`
where `user_functional_areas`.`user_id` in (2, 6, 7)
但实际上 6 和 7 是企业 id 而不是用户只有 2 是用户 id,其中一个查询应该使用business_functional_areas
而不是user_functional_areas
. 发现的另一件事是,App\User
结果中的所有项目都在模型内部,它businesses
也作为用户对象。
解决方案
简而言之,目前您无法使用Eloquent Eager Loading
with来实现它Unions
。Laravel 尚不支持此功能。他们作为Non-Fix
问题关闭的其中一种情况是Union with Eloquent fail ...。
原因:在调用UNION
函数时,只有第一个模型(user
)被认为是主模型,并且作为参数传递的其他模型(Business
)的结果集的模型类型将仅转换为主模型(USER
),并且在所有记录上调用主模型关系(不是想要的)。
由于上述问题,只user
在结果集的每条记录上调用模型关系。所以即使business_id = 1,user_id = 1 的functional_area 也会被获取。
您可以从下面的文件和函数中调试更多关于它的信息。
File:
<your_laravel_project>\vendor\laravel\framework\src\Illuminate\Database\Query\Builder.php
Function: get
替代解决方案 您可以按原样获取两个结果集,然后在使用 php 获取数据后合并它们。
public function usersAndOrganizations()
{
$users = $this->users()->get();
$organizations = $this->organizations()->get();
$invitees = $users->toBase()->merge($organizations->toBase())->toArray();
dd($invitees);
}
推荐阅读
- python - 有人可能知道这个 Python 中的 Web Scraping
- javascript - 如何正确使用 clearInterval
- typescript - NestJS - 测试 @Inject('Value') 依赖
- scala - 系统未在 GKE 上 docker 的 scala 应用程序中终止
- python - 带有事务的 Pandas to_sql
- arduino - 如何在 Verilog 中创建和使用任务
- php - PHPMailer 不会通过 localhost 发送电子邮件
- azure-functions - 沙盒 Blazor WebAssemblies 代替 AppDomain 沙盒
- python - 尝试使用 FastAPI 和 python-docx 库读取 docx 文件:AttributeError: 'bytes' object has no attribute 'seek' 错误
- python - Tkinter 回调中的异常:TypeError:float() 参数必须是字符串或数字,而不是“事件”