检查是否存在多对多关系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
}