检查是否存在多对多关系Laravel

检查是否存在多对多关系Laravel,laravel,laravel-4,eloquent,Laravel,Laravel 4,Eloquent,我有以下型号: /* Team.php */ class Team extends Eloquent { public function users() { return $this->belongsToMany('User'); } } /* User.php */ class User extends Eloquent { public function teams() { return $this->hasMany('Team');

我有以下型号:

/* Team.php */

class Team extends Eloquent {

  public function users() {
    return $this->belongsToMany('User');
  }

}

/* User.php */

class User extends Eloquent {

  public function teams() {
    return $this->hasMany('Team');
  }

}
和数据库结构:

teams
  id
  user_id
  name

users
  id
  email

team_user
  id
  team_id
  user_id
用户可以创建(并拥有-因此teams.user_id)一个团队,但也属于其他团队

如果可能的话,我希望能够使用Eloquent获得特定用户的所有团队,而无需执行如下自定义SQL查询:

 SELECT teams.* 
 FROM teams 
 JOIN team_user 
 ON (team_user.team_id = teams.id) 
 WHERE team_user.user_id = ?
自定义SQL查询可以工作,但我确信这不是Laravel中的原生方式


有人能帮忙吗?提前感谢您的阅读。

在我看来,您就快到了,您已经建立了关系,所以现在您只需要:

$user = User::find(1);

foreach($user->teams as $team)
{
   echo $team->name;
}
由于Laravel希望有一个teams_users pivot表名,您可能还需要告诉它正确的名称,并在以下两种情况下使用belongToMany():


对于要使用的透视表,应该在关系的两侧返回
$this belongToMany(Model::class)

/* Team.php */

class Team extends Eloquent {

    public function users() {
        return $this->belongsToMany(User::class);
    }

}

/* User.php */

class User extends Eloquent {

    public function teams() {
        return $this->belongsToMany(Team::class);
    }

}
团队中不需要有
用户id
字段,因为这隐含着
多对一
。(此团队只有一个用户)

在这种情况下,使用eloquent为一个用户获取所有团队将非常简单:

User::teams()->get();
反过来呢

Team::users()->get();
或者获取用户实体及其所有团队:

User::with('teams')->get();
反之亦然

Team::with('users')->get();

应该是这样的


如果您使用团队中的user_id列来确定该对象的所有权,则没有理由取消该列

也就是说,将密钥更恰当地命名为manager_id或类似的名称会更有意义。此外,没有任何东西表明必须使用与相关(复数)表名相同的关系函数名

除了上面的以下设置外,还可以尝试以下操作:

<?php
    class Team extends Eloquent {

        ...

        public function manager()
        {
            return belongsTo('User', 'manager_id');
        }

        ...

    }

<?php
    class User extends Eloquent {

        ...

        public function manages()
        {
            return hasMany('Team', 'manager_id');
        }

        ...

    }        

要回答标题中的问题,以下是如何在用户模型中定义布尔函数,以了解数据透视表“team_user”中是否存在关系:

public function isPartOfThe($team)
{
    return $this->teams()->where('team_id', $team->id)->exists();
}
然后,您可以在控制器中调用函数,如下所示:

If($user->isPartOfThe($team)
{
    //true
}

安东尼奥、乔希和你自己都是对的——需要一种归属感。我想我需要弄清楚这会对应用程序的其余部分造成什么影响,因为团队现在没有所有者用户(这就是为什么不存在反向关系的原因。如果您使用用户id列来确定该对象的所有权,则没有理由取消团队中的用户id列。也就是说,将密钥更恰当地命名为所有者id或类似的名称会更有意义。@Abba是的,这是事实,当然与OP在评论。事实上,没有理由不能与多对多并行创建特定的多对一关系。太棒了!我喜欢这个解决方案,因为我认为它在数据库上更友好。而不是选择所有记录并迭代。
public function isPartOfThe($team)
{
    return $this->teams()->where('team_id', $team->id)->exists();
}
If($user->isPartOfThe($team)
{
    //true
}