加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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

请记住,我只是将这些作为指南.没有测试任何一个.希望您可以应用逻辑.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读