两个外键,如何用 laravel eloquent 映射

Posted

技术标签:

【中文标题】两个外键,如何用 laravel eloquent 映射【英文标题】:two foreign keys, how to map with laravel eloquent 【发布时间】:2014-09-23 13:30:12 【问题描述】:

我在 mysql 中有两个表,其中第一个称为 users,第二个称为 games。表结构如下。

用户

id(主要) 电子邮件 密码 真实姓名

游戏

id(主要) user_one_id(国外) user_one_score user_two_id(国外) user_two_score

我的游戏桌对两个用户有两个对外关系。

我的问题是如何为这个表结构建立模型关系? - 根据the laravel documentation,我应该在模型内部创建一个函数并将其与其关系绑定

例如

public function users()

    $this->belongsTo('game');

但是我似乎在文档中找不到任何东西告诉我如何处理两个外键。就像我上面的表格结构一样。

我希望你能帮助我。

谢谢

【问题讨论】:

有些答案有用吗?提供反馈。 【参考方案1】:

迁移:

$table->integer('player1')->unsigned();
$table->foreign('player1')->references('id')->on('users')->onDelete('cascade');
$table->integer('player2')->unsigned();
$table->foreign('player2')->references('id')->on('users')->onDelete('cascade');

还有一个模型:

public function player1()

    $this->belongsTo('Game', 'player1');

public function player2()

    $this->belongsTo('Game', 'player2');

编辑 按照用户 deczo 的建议将“游戏”更改为“游戏”。

【讨论】:

您只需要使用确切的型号名称,可能是Game。否则这将抛出 class game not found 致命错误。 谢谢,据我了解,您只是为表中的每个关系创建一个新的“关系”函数?我没有带我的工作电脑,但我稍后会试试看:) 当然,您可以根据需要命名文件,如果它不遵循命名约定,则必须将名称指定为关系函数中的第二个参数。【参考方案2】:

不幸的是,您的这种设置方式在当前环境下不太可能奏效。使用 belongsTo 方法可能更幸运,但同样只支持一种关系。

你可以实现一个 user1() belongsTo,一个 user2() belongsTo,最后只声明一个非 eloquent 函数来返回两者(类似于 $users = array($this->user1(), $this->user2( ))

【讨论】:

以上是关于两个外键,如何用 laravel eloquent 映射的主要内容,如果未能解决你的问题,请参考以下文章

如何用 phpunit 模拟 Laravel Eloquent 模型?

Laravel Eloquent 关系与多个带有“OR”的外键

如何用 Eloquent 建立多态关系

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

Eloquent - 如果外键有行,则防止删除数据 - Laravel

Laravel 5.3 Eloquent 交易和外键限制