我有以下型号:
/* 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中的本地方式。
有人可以帮忙吗?提前感谢您阅读。
答案 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');
}
...
}
我觉得以前的答案并不能说明你完全尝试的数据模型。