我一直在try 定义一些数据库模式来使用laravel框架.我想做一场足球比赛的模特.我想做的第一步是定义实体关系图,但我发现这(我认为这很简单)在某些方面令人困惑.

首先,显而易见的方法是说一场比赛与两支球队有关,一支球队与任何数量的比赛有关.所以,我们会有一种"多对多"的关系.

但多对多关系的实现需要两个表和一个中间表来关联这两个实体.我觉得这太过分了,因为我知道一场比赛总是有两支球队,只要有两列(local_id和visitant_id)和球队表的外键就足够了.另外,我希望能够做到:

Match::find(1)->local() or Match::find(1)->visitant();

所以,考虑到这一点,我实施了"一对多"的关系,但我有另一个问题.要恢复一支球队的所有比赛,我想:

Team::find(1)->matches(); 

但我不能这样做,因为在eloquent中定义matches()方法时,我只能指定一个键列(默认情况下,它应该是team_id,但应该是visitant_id和local_id).

推荐答案

在深入研究源代码之后,我发现有一种方法可以让我的数据库模式保持原样,实现我想要的(至少在Laravel 4中).我在github上发布了我的问题,Taylor Otwell(框架的创建者)给了我正确的答案:https://github.com/laravel/framework/issues/1272

引用他的话,应该很简单:

class Team extends Eloquent  {
    public function allMatches()
    {
        return $this->hasMany('Match', 'visitant_id')->orWhere('local_id', $this->id);
    }
}

然后...

$team = Team::find(2);
$matches = $team->allMatches;

Laravel相关问答推荐

使用Laravel判断其他数据库中是否存在记录

如何仅将日期列解析为月和日?

未找到 apiResource 404 中的变量

如何保存/重定向 Laravel Artisan 命令的输出?

Laravel 连接表

处理程序类中的错误 - Laravel

如何在 Laravel Passport 中获取刷新令牌?

laravel 基本路径

Laravel:如何通过 id 从集合中删除项目

使用 Laravel 和 Passport 验证失败时响应状态码 401?

Laravel:如何在没有数据库的情况下对用户进行身份验证

需要 Vagrant 环境或目标机器

Laravel 5 - Php artisan语法错误

如何在 Laravel 5 中验证当前、新密码和新密码确认?

Laravel Mail 发送Electron邮件但返回 false

Mac OS X 需要 Mcrypt PHP 扩展

如何卸载 Laravel Passport

Laravel 4 - 一个表单中有两个提交按钮,并且两个提交都由不同的操作处理

如何使 Laravel (Blade) 文本字段只读

Laravel如何仅响应没有正文消息的204代码状态