php – 使用join查找数据透视表和相关数据的Eloquent查询
发布时间:2020-12-13 15:57:24 所属栏目:PHP教程 来源:网络整理
导读:在我的控制器中,我有一个这样的查询: $userinfos = User::with('skills');$userinfos-with('positions');$userinfos=$userinfos-get(); 这工作正常,在我看来,我得到这样的位置名称: @forelse ($userinfos[0]-positions as $key=$position) {{ $position-na
在我的控制器中,我有一个这样的查询:
$userinfos = User::with('skills'); $userinfos->with('positions'); $userinfos=$userinfos->get(); 这工作正常,在我看来,我得到这样的位置名称: @forelse ($userinfos[0]->positions as $key=>$position) {{ $position->name}} @empty No position listed @endforelse 我有另一个像这样来检索相关的公司数据: $positions = DB::table('positions') ->select(DB::raw('position_user.id as id,positions.id as position_id,positions.name as position_name,companies.id as company_id,companies.name as company_name,position_user.user_id')) ->join('position_user','position_user.position_id','=','positions.id') ->join('companies','companies.id','position_user.company_id') ->join('users','users.id','position_user.user_id') ->where('position_user.user_id',$userid) ->get(); 这也适用于获得职位和公司名称: @forelse($positions as $key=>$position) {{$position->position_name}} @ {{$position->company_name}} @empty No position listed @endforelse 我确信必须有一种方法将两者结合起来,以便我可以在第一个查询中获取公司名称.我正在寻找这样的东西: $userinfos = User::with('skills'); $userinfos->with('positions'); $userinfos->whereHas('positions',function($thisQuery) { $thisQuery->join('companies','position_user.company_id'); }); $userinfos=$userinfos->get(); 这甚至可能吗?任何想法/方向将不胜感激! 编辑: 我是否应该考虑在我的Position类中添加一个连接以启用上述功能: public function users() { return $this->belongsToMany('AppUser')->withTimestamps() ->withPivot('company_id'); ->join('companies','position_user.company_id'); } 如果是这样 – 我将如何在视图中访问它? 解决方法
您应该创建自己的数据透视模型,例如UserPosition,并覆盖newPivot()方法.
class User extends Eloquent { public function positions() { return $this->belongsToMany('Position')->withPivot('company_id'); } public function newPivot(Model $parent,array $attributes,$table,$exists) { if ($parent instanceof Position) { return new UserPosition($parent,$attributes,$exists); } return parent::newPivot($parent,$exists); } } 而且你有像这样的枢轴模型 class UserPosition extends IlluminateDatabaseEloquentRelationsPivot { public function company() { return $this->belongsTo('Company'); } } 然后你可以做类似下面的代码.当然你可以迭代位置而不是获取first(). $user = User::find(1); $user->positions()->first()->pivot->company 请记住,我只是将这些作为指南.没有测试任何一个.希望您可以应用逻辑. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |