如何在 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 - 如何获得编译查询?

如何在你已经获得的东西上使用 Laravel Eloquent ::with()?

Laravel Eloquent 如何根据计数获得关系总和

Laravel Eloquent - 如何获得嵌套关系

Laravel Eloquent:如何从多个表中进行选择

Laravel - Eloquent - 获得没有外键的关系