我一直试图定义一些数据库模式来使用laravel框架.我想模拟一场足球比赛.我想要做的第一步是定义实体关系图,但是我发现这个(我认为很简单)在一些方面是混乱的.
首先,明显的做法是说一场比赛与两队相关,一队与任意数量的比赛有关.所以我们会有一个“多对多”的关系.
但是,实现多对多的关系是有两个表和一个中间表来关联两个实体.我认为这将是太多了,当我知道一场比赛总是有两个球队,只需要有两个列(local_id和visitant_id)和外部的球队表格就足够了.另外,我想要能够做到Match :: find(1) – > local()或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;
更新:github链接不起作用,因为laravel没有以这种方式再次出现错误报告:http://laravel-news.com/2014/09/laravel-removes-github-issues/