从引用的密钥表中检索数据 - Laravel-4

时间:2013-11-17 07:26:02

标签: database database-design laravel laravel-4

有关表的结构如下(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_idaway_team_id,然后执行类似

的操作
Fixture::where('tid','=',$home_team_id)->get();

我的问题是,这是完成我的目标的正确方法吗? 和 应该从控制器完成吗? (如果是这样,那么我将不得不从同一个函数做两个查询)

1 个答案:

答案 0 :(得分:3)

首先,不要让主键为tidfid,而是将它们保留为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();