多对一关系laravel

时间:2014-06-12 14:40:54

标签: php mysql laravel eloquent

好的,我在Laravel中构建了一个非常大的应用程序。用户管理自己的虚拟足球队。我有一个用户表然后我有一个团队表与团队specefic事情,如名称,级别和竞技场等。虽然我决定添加一个竞技场表,然后在团队表中添加一个arena_id列而不是添加球队表的竞技场名称。

所以这是基本的关系:

用户有一个团队

团队拥有一个用户

团队hasOne Arena

Arena hasOne Team

所以,如果我想为用户赢得竞技场,我会调用方法

$user = User::with('team')->where('username', '=', $username)->first();

$user->team->arena->arena_name; 

一切正常;但是我觉得有一种更清洁或更简单的方法。这个应用程序是否存在或没有问题?

2 个答案:

答案 0 :(得分:1)

你这样做的方式没有错。这是满足您需求的完美方式。但是,可能有用的是在User模型中创建getArenaFromUsername()方法。您的用户模型如下所示:

<?php

class User extends \Eloquent {

    protected $fillable = [];

    public function getArenaFromUsername($username)
    {
        $user = User::with('team')->where('username', '=', $username)->first();
        return $user->team->arena->arena_name;
    }
}

然后从控制器中获取竞技场名称:

$user = new User;
$arena = $user->getArenaFromUsername($username);

----------------------------------------- OR ----- ------------------------------------------

或者使用我们刚刚在模型中创建的相同方法在控制器中执行以下操作来使用依赖项注入:

protected $user;

public function __construct(User $user)
{
    $this->user = $user;
}

然后使用它你可以在控制器的任何方法中使用一行,如下所示:

$this->user->getArenaFromUsername($username);

这些是抽象查询的不同方法,使其在控制器中调用时更加可重用和更清晰。不要害怕在模型中公开方法来打电话。

答案 1 :(得分:1)

一些事情。

您可以像这样急切加载子关系:

User::with('team', 'team.arena')...

您还可以在User模型上创建一个访问器函数(http://laravel.com/docs/eloquent#accessors-and-mutators),使其成为User对象的第一类属性:

// accessed via $user->arena
public function getArenaAttribute {
  return $this->team->arena;
}

// accessed via $user->arenaName
public function getArenaNameAttribute {
  return $this->team->arena->arena_name;
}