如何在 Laravel/Eloquent 中获得完整的关系
Posted
技术标签:
【中文标题】如何在 Laravel/Eloquent 中获得完整的关系【英文标题】:How to get the full Relation in Laravel/Eloquent 【发布时间】:2020-06-19 01:02:38 【问题描述】:目前我尝试学习 Laravel 和 Laravel Eloquent。 我尝试使用 Laravel 中的关系来解决问题。
我的简单 Laravel 项目中有以下数据库结构。
table players:
id name
table clubs:
id name icon
table players_x_clubs:
player_id club_id
这是一对多的关系。
有没有可能得到结合player_id的full club Object?!
第一次尝试是将它添加到我的玩家模型中
public function club()
return $this->hasOne('App\PlayersXClub');
在这里,我只得到带有 player_id 和 club_id 的 PlayersXClub Relation
但我想从俱乐部表中获取完整的俱乐部对象,是否有可能以简单的方式?
任何想法我必须如何实现它是正确的?
我的解决方案是这样的:
public function getClubRelation()
$clubRelation = $this->hasOne('App\PlayersXClub')->get()->first();
$club = Club::whereId($clubRelation->club_id)->get()->first();
return $club;
有了这个解决方案,我可以在我的代码$player->getClubRelation()->icon
中做到这一点
但我不知道它是否正确解决了,还是有更简单的方法可以用 Eloquent 解决它?
【问题讨论】:
你有一个多对多关系,使用hasMany
我猜你的关系
你设置表格的方式,在我看来这是一个多对多关系。
hm 但是在我的情况下,1 个玩家只能拥有 1 个俱乐部,而 1 个俱乐部可以拥有多个玩家......所以一对多是正确的还是?
【参考方案1】:
您始终可以访问对象关系。例如:
$player = Player::find(1);
$club = $player->club;
或更好
$player = Player::with('club')->find(1);
但是,我相信您不需要额外的桌子。一个额外的表会导致多对多关系,这在这里没有多大意义。
一名球员属于一个俱乐部,而一个俱乐部可以拥有多名球员。所以是一对多。
您应该向玩家表添加一个 club_id 外键。
$table->unsignedBigInteger('club_id');
$table->foreign('club_id')->references('id')->on('clubs')->onDelete('cascade');
播放器类
public function club()
return $this->belongsTo(Club::class);
俱乐部班
public function players()
return $this->hasMany(Player::class);
【讨论】:
啊好吧!现在我明白了,你说得对,迪诺,我不需要额外的桌子,对吧!谢谢你睁开眼睛!以上是关于如何在 Laravel/Eloquent 中获得完整的关系的主要内容,如果未能解决你的问题,请参考以下文章
laravel Eloquent ORM - 如何获得编译查询?