有关表的结构如下(MySQL):
//Table Name : team
tid PK
team_name (varchar)
//Table Name : fixture
fid PK
home_team_id FK |_ both referenced to 'tid' from 'team' table
away_team_id FK |
我的目标是检索团队名称。考虑到这种结构,我想我必须检索home_team_id
和away_team_id
,然后执行类似
Fixture::where('tid','=',$home_team_id)->get();
我的问题是,这是完成我的目标的正确方法吗? 和 应该从控制器完成吗? (如果是这样,那么我将不得不从同一个函数做两个查询)
答案 0 :(得分:3)
首先,不要让主键为tid
和fid
,而是将它们保留为id
。这不仅是最佳实践,而且还允许您更轻松地使用Laravel的Eloquent ORM,因为默认情况下假设您的主键列名为id
。
第二件事,确保你的表名是复数形式。虽然这不是必需的,但我要提供的示例是使用Laravel默认值,而Laravel假设它们是复数形式。
无论如何,一旦你'Laravelized'你的数据库,你可以使用一个Eloquent模型,用非常少的工作来设置真棒关系。这是我认为你想做的事情。
应用/模型/ Team.php 强>
class Team extends Eloquent {
// Yes, this can be empty. It just needs to be declared.
}
应用/模型/ Fixture.php 强>
class Fixture extends Eloquent {
public function homeTeam()
{
return $this->belongsTo('Team', 'home_team_id');
}
public function awayTeam()
{
return $this->belongsTo('Team', 'away_team_id');
}
}
上面,我们创建了一个简单的模型Team
,Laravel将在teams
数据库表中自动查找。
其次,我们创建了模型Fixture
,Laravel将再次使用fixtures
表。在这个模型中,我们指定了两个关系。 belongsTo
关系有两个参数,它与哪个模型相关,在这两种情况下它们都是团队,以及列名称是什么。
Laravel将自动获取away_team_id
中的值,并根据id
表格中的teams
列进行搜索。
只需这么少的代码,你就可以做这样的事情。
$fixture = Fixture::find(1); // Retrieves the fixture with and id of 1.
$awayTeam = $fixture->awayTeam()->first(); // var_dump this to see what you get.
$homeTeam = $fixutre->homeTeam()->first();
然后您可以正常进行并访问表的列名。所以说你在团队表中有一个'name'列。您可以像这样从夹具中回显主队名称。
$fixture = Fixture::find(1); // Get the fixture.
echo $fixture->homeTeam->name;
已接近凌晨2点,因此上面可能有一两个错误,但它应该有效。
请务必查看Eloquent的文档,尤其是与关系相关的位。请记住以Laravel要求的方式命名您的列和表。如果不这样做,可以通过多种方式指定自定义名称。
如果您想获得更多的幻想,可以在团队模型上定义这样的反向关系。
应用/模型/ Team.php 强>
class Team extends Eloquent {
public function fixturesAtHome()
{
return $this->hasMany('Fixture', 'home_team_id');
}
public function fixturesAway()
{
return $this->hasMany('Fixture', 'away_team_id');
}
}
然后获得所有特定球队的主场比赛......
$team = Team::find(1); // Retreive team with id of 1;
$homeFixtures = $team->fixturesAtHome();