2014-06-12 216 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; 
}