Laravel 如何使用透视表和使用FK的另一个表执行联接查询

Laravel 如何使用透视表和使用FK的另一个表执行联接查询,laravel,laravel-4,eloquent,Laravel,Laravel 4,Eloquent,我已经建立了如下的关系 用户模型 public function branches() { return $this->belongsToMany('Branch', 'branch_user', 'user_id', 'branch_id'); } public function reservations() { return $this->hasMany('Reservation'); } public function users() { ret

我已经建立了如下的关系

用户模型

public function branches() 
{
    return $this->belongsToMany('Branch', 'branch_user', 'user_id', 'branch_id');
}

public function reservations() {
    return $this->hasMany('Reservation');
}
public function users() 
{
    return $this->belongsToMany('User', 'branch_user', 'branch_id', 'user_id');
}
public function branches() {
    return $this->BelongsTo('Branch');
}
public function branch()
{
    return $this->belongsTo('Branch');
}
public function users()
{
    return $this->hasMany('User');
}

public function reservations()
{
    return $this->hasMany('Reservation');
}
public function branch() {
    return $this->belongsTo('Branch');
}
分支机构模型

public function branches() 
{
    return $this->belongsToMany('Branch', 'branch_user', 'user_id', 'branch_id');
}

public function reservations() {
    return $this->hasMany('Reservation');
}
public function users() 
{
    return $this->belongsToMany('User', 'branch_user', 'branch_id', 'user_id');
}
public function branches() {
    return $this->BelongsTo('Branch');
}
public function branch()
{
    return $this->belongsTo('Branch');
}
public function users()
{
    return $this->hasMany('User');
}

public function reservations()
{
    return $this->hasMany('Reservation');
}
public function branch() {
    return $this->belongsTo('Branch');
}
预订模式

public function branches() 
{
    return $this->belongsToMany('Branch', 'branch_user', 'user_id', 'branch_id');
}

public function reservations() {
    return $this->hasMany('Reservation');
}
public function users() 
{
    return $this->belongsToMany('User', 'branch_user', 'branch_id', 'user_id');
}
public function branches() {
    return $this->BelongsTo('Branch');
}
public function branch()
{
    return $this->belongsTo('Branch');
}
public function users()
{
    return $this->hasMany('User');
}

public function reservations()
{
    return $this->hasMany('Reservation');
}
public function branch() {
    return $this->belongsTo('Branch');
}
分支有许多保留,分支属于分支

请告诉我如何做下面的查询

select table_number from reservations r
JOIN branches b
ON b.id = r.branch_id 
JOIN branch_staff bs
ON bs.branch_id = b.id  
WHERE bs.user_id = 1
使用雄辩的语言

我已经这样做了上面的查询

DB::table('reservations')
->join('branches', 'branches.id', '=', 'reservations.branch_id')
->join('branch_staff', 'branch_staff.branch_id', '=', 'branches.id')
->where ('branch_staff.user_id', '=', Auth::user()->id)
->select('reservations.table_number', 'reservations.active')
->orderBy('reservations.table_number', 'asc')
->get();
使用查询生成器

关系
但是,我如何使用Elount做到这一点,尤其是当我定义了关系时?

首先,我认为您可能设置了错误的模型。从SQL来看,用户似乎只有一个分支,而不是多个。如果一个预订属于一个分支,你可以调用方法“branch”,而不是“branchs”

我会这样设置模型:

用户模型

public function branches() 
{
    return $this->belongsToMany('Branch', 'branch_user', 'user_id', 'branch_id');
}

public function reservations() {
    return $this->hasMany('Reservation');
}
public function users() 
{
    return $this->belongsToMany('User', 'branch_user', 'branch_id', 'user_id');
}
public function branches() {
    return $this->BelongsTo('Branch');
}
public function branch()
{
    return $this->belongsTo('Branch');
}
public function users()
{
    return $this->hasMany('User');
}

public function reservations()
{
    return $this->hasMany('Reservation');
}
public function branch() {
    return $this->belongsTo('Branch');
}
分支机构模型

public function branches() 
{
    return $this->belongsToMany('Branch', 'branch_user', 'user_id', 'branch_id');
}

public function reservations() {
    return $this->hasMany('Reservation');
}
public function users() 
{
    return $this->belongsToMany('User', 'branch_user', 'branch_id', 'user_id');
}
public function branches() {
    return $this->BelongsTo('Branch');
}
public function branch()
{
    return $this->belongsTo('Branch');
}
public function users()
{
    return $this->hasMany('User');
}

public function reservations()
{
    return $this->hasMany('Reservation');
}
public function branch() {
    return $this->belongsTo('Branch');
}
预订模式

public function branches() 
{
    return $this->belongsToMany('Branch', 'branch_user', 'user_id', 'branch_id');
}

public function reservations() {
    return $this->hasMany('Reservation');
}
public function users() 
{
    return $this->belongsToMany('User', 'branch_user', 'branch_id', 'user_id');
}
public function branches() {
    return $this->BelongsTo('Branch');
}
public function branch()
{
    return $this->belongsTo('Branch');
}
public function users()
{
    return $this->hasMany('User');
}

public function reservations()
{
    return $this->hasMany('Reservation');
}
public function branch() {
    return $this->belongsTo('Branch');
}
然后,您可以使用以下代码获取分支机构工作人员的有序Auth::user()表编号列表:

$tableNumbers = Auth::user()->branch->reservations()->orderby('reservations.table_number', 'asc')->lists('table_number');

如果没有@Vokemike,这个答案是不可能的

我一直在$reservations中得到collections错误,这是因为branchs返回一个集合,所以要解决这个问题,我必须对它进行循环,我就是这样做的

$user_branch = Auth::user()->branches;

    foreach ($user_branch as $branch) {
       return $branch->reservations()->orderby('reservations.table_number', 'asc')->lists('table_number');
 }

谢谢你的回复,很抱歉我迟了回复。我试过了,但是在没有创建代码的情况下得到了“在null上调用成员函数reservations()”,我想不出有什么不对。听起来你没有得到任何回报。试着确保你得到了分支。Auth::user()当然依赖于用户的登录。@VotemikeI认为我知道是什么问题,但不知道如何解决。请看图片。分支用户是数据透视表。因此,如果一个用户属于一个分支,这不意味着我需要分支表中的用户id吗?请记住,一个用户可以被分配到一个或多个分支。您应该能够像以前一样使用
belongtomany()
。在你最初的问题中,你不清楚你有一个数据透视表。当然,您应该将您的“分支”更新为“分支”。这本书很好,应该对你有帮助。