雄辩关系 - 关系的关系

时间:2014-07-06 20:18:27

标签: laravel laravel-4 eloquent relationship

我有三个表:UserClientPosition。工作流程如下:

  1. client创建自己的positions集。
  2. clientusers添加到其管理中,然后将positions分配给他们
  3. user可以属于多个不同的clients
  4. 所以这些表之间的关系是:

    • ClientPosition:一对多
    • PositionUser:多对多
    • ClientUser:多对多

    目前,我的模型如下:

    Class User extends Eloquent {
        public function clients() 
        {
            return $this->belongsToMany('Client');
        }
    
        public function positions() 
        {
            return $this->belongsToMany('Position');
        }
    }
    
    Class Client extends Eloquent {
        public function users() 
        {
            return $this->belongsToMany('User');
        }
    
        public function positions() 
        {
            return $this->hasMany('Position');
        }
    }
    
    // The Position model is not included, since it doesn't make sense to start from a position
    

    因此,假设User属于两个Clients,并且每个Positions都有不同的Clients。一个例子是:

    • 我有两个客户:索尼和微软
    • 我有两个用户:John和Mike。
    • 微软有职位:开发人员和工程师。
    • 索尼拥有职位:市场营销和财务。
    • John在Microsoft担任开发人员。
    • Mike在微软担任工程师,在索尼担任财务人员。

    我只想让迈克在微软的职位。现在,我知道如何做到这一点的唯一方法如下:

    $c_id = $Microsoft_Id;
    $u_id = $Mike_Id;
    Client::find($c_id)
            ->users()
            ->whereId($u_id)
            ->with(['positions' => function($query) use ($c_id) 
                   {
                       $query->whereClientId($c_id);
                   }
            ])
            ->get();
    

    我有可能在模型中执行此任务吗?如果我只是说:

    ,这会更直观
    Client::find($c_id)
            ->users()
            ->whereId($u_id)
            ->with('positions')
            ->get();
    

    检查在模型本身内进行。

1 个答案:

答案 0 :(得分:0)

您可以使用此功能,但在预先加载时无法正常工作,因为显然$id无法访问:

// Client model
public function usersWithPositions()
{
    $id = $this->getKey();

    return $this->belongsToMany('User')->with(['positions' => function ($q) use ($id) {
        $q->whereClientId($id);
    }]); 
}

// will work
$client = Client::find($c_id);
$client->usersWithPositions;
// or
$Mike = $client->usersWithPositions()->where('users.id', $u_id)->first();


// won't work
Client::with('usersWithPositions')->get();

您可以对此方法添加检查,因此它不会抛出异常,但仍然无法使用预先加载。