【问题标题】:Retrieving data from referenced key table - Laravel-4从引用的键表中检索数据 - Laravel-4
【发布时间】:2013-11-30 10:53:29
【问题描述】:

相关表的结构如下(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();

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

【问题讨论】:

    标签: database database-design laravel laravel-4


    【解决方案1】:

    首先,不要将主键设为tidfid,而是将它们都保留为id。这不仅是最佳实践,而且可以让您更轻松地使用 Laravel 的 Eloquent ORM,因为它默认假定您的主键列名为 id

    第二件事,确保你的表名是复数形式。虽然这不是必需的,但我即将给出的示例是使用 Laravel 默认值,并且 Laravel 假设它们是复数形式。

    无论如何,一旦您“Laravelized”了您的数据库,您就可以使用 Eloquent 模型以极少的工作量建立出色的关系。这就是我认为你想做的事情。

    app/models/Team.php

    class Team extends Eloquent {
        // Yes, this can be empty.  It just needs to be declared.
    }
    

    app/models/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 中的值,并在 teams 表中的 id 列中搜索它。

    只需这么少的代码,您就可以做这样的事情。

    $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();
    

    然后您可以正常进行并访问表的列名。因此,假设您在团队表中有一个“名称”列。您可以像这样从夹具中呼出主队名称。

    $fixture = Fixture::find(1); // Get the fixture.
    echo $fixture->homeTeam->name;
    

    现在快凌晨 2 点了,所以上面可能有一两个错误,但它应该可以工作。

    请务必检查文档中的 Eloquent,尤其是与关系相关的部分。请记住按照 Laravel 想要的方式命名列和表。如果您不这样做,有一些方法可以指定您的自定义名称。

    如果你想变得更花哨,你可以在你的团队模型上定义这样的反向关系。

    app/models/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();
    

    【讨论】:

    • 感谢您如此详尽的回答。它解决了我关于这个问题的所有问题!
    猜你喜欢
    • 2017-05-18
    • 2021-08-28
    • 2020-04-24
    • 2019-09-08
    • 2014-10-17
    • 2016-03-07
    • 2020-06-10
    • 1970-01-01
    • 2020-04-06
    相关资源
    最近更新 更多