2014-06-12 175 views
0

好吧,我正在Laravel构建一个非常大的应用程序。用户管理他们自己的虚拟足球队。我有一个用户表,然后我有一个团队表,其中包含名称,级别和竞技场等团队特有的东西。对于竞技场,尽管我决定添加一个arenas表,然后在team表中添加arena_id列,而不是仅添加球队名单上的球队名称。多对一的关系laravel

所以这里是基本relantionship:

用户hasOne队

队hasOne用户

队hasOne竞技场

竞技场hasOne队

,所以如果我想获得的对于用户而言,我称之为方法

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

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

和一切工作正常;不过,我觉得有一个更干净或更简单的方法来做到这一点。对于这个应用程序有没有这个问题?

+0

仅供参考:您可以通过'User :: with('team','team.arena')'来加载子关系。 – ceejayoz

回答

1

你这样做没有问题。这是满足您需求的完美方式。然而,可能有帮助的是在用户模型中创建一个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); 

------------- - - - - - - - - - - - - - - 要么 - - - - - - - - - - - --------------------------

或者在控制器中使用我们刚刚创建的相同方法使用依赖注入型号:

protected $user; 

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

然后使用它,你可以使用一个行的任何方法在你的控制器像这样:

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

这些都是抽象查询,使之更具可重用性和清洁您的控制器调用的所有不同的方式。不要害怕在你的模型中使用公共方法来调用。

1

一些事情。

你可以贪婪加载像这样子的关系:

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

您也可以在您的用户模型创建访问功能(http://laravel.com/docs/eloquent#accessors-and-mutators),使其在用户对象上的第一类属性:

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

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