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

时间:2013-11-19 12:11:18

标签: 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');
  }

}

和数据库结构:

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中的本地方式。

有人可以帮忙吗?提前感谢您阅读。

5 个答案:

答案 0 :(得分:3)

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

public function isPartOfThe($team)
{
    return $this->teams()->where('team_id', $team->id)->exists();
}

然后您可以按如下方式调用控制器中的功能:

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

答案 1 :(得分:1)

您应该在关系的两边返回$this-belongsToMany(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);
    }

}

团队中不需要user_id字段,因为这隐含地说Many-to-one。 (该团队只有一名用户)

有了这个问题,使用eloquent为用户提供所有团队就像这样简单:

User::teams()->get();

反向

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

或者获得所有团队的用户实体:

User::with('teams')->get();

反之亦然

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

答案 2 :(得分:0)

在我看来你几乎就在那里,你已经设定了你的关系,所以现在你只需要:

$user = User::find(1);

foreach($user->teams as $team)
{
   echo $team->name;
}

由于Laravel希望使用teams_users数据透视表名称,您可能还需要告诉它正确的名称并在两者上使用belongsToMany():

class Team extends Eloquent {

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

}

class User extends Eloquent {

  public function teams() {
    return $this->belongsToMany('Team', 'team_user');
  }

}

答案 3 :(得分:0)

应该是这样的

class User {
    public function teams() {
        return $this->belongsToMany('User', 'team_user');
    }
}


class Team {
    public function user() {
        return $this->belongsToMany('Team', 'team_user');
    }
}

答案 4 :(得分:0)

如果您正在使用它来确定该对象的所有权,则没有理由删除团队中的user_id列。

话虽如此,将命令更恰当地命名为manager_id或类似内容会更有意义。此外,没有任何内容表明您必须使用与相关(复数)表名相同的关系函数名称。

除了上面的belongsToMany设置外,请尝试这样的事情:

<?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');
        }

        ...

    }        

我觉得以前的答案并不能说明你完全尝试的数据模型。