2014-11-22 28 views
0

我現在正在爲此苦苦掙扎,但我無法弄清楚它是如何工作的。 laravel我有一些關係模型。我不希望基於登錄用戶和工作區的傳遞參數來創建帳戶。如何在laravel中創建一排關係?

這是模型的樣子:(我只coppied方法來保持短)

用戶模型:

class User extends Eloquent implements UserInterface, RemindableInterface { 

    public function workspaces() 
    { 
     return $this->hasMany('Workspace', 'user_id'); 
    } 

    public function account() 
    { 
     return $this->hasManyThrough('account', 'Workspace', 'id', 'workspace_id'); 
    } 
} 

工作空間模型:

class Workspace extends Eloquent implements UserInterface, RemindableInterface { 

    public function account() 
    { 
     return $this->hasMany('account', 'workspace_id', 'id'); 
    } 
    public function user() 
    { 
     return $this->belongsTo('User', 'user_id', 'id'); 
    } 
} 

賬戶型號

class account extends Eloquent implements UserInterface, RemindableInterface { 

    public function account_url() 
    { 
     return $this->hasOne('acountUrl', 'id', 'account_url_id'); 
    } 
    public function workspace() 
    { 
     return $this->belongsTo('Workspace', 'workspace_id', 'id'); 
    } 
} 

的account_url模型

class account_url extends \Eloquent implements UserInterface, RemindableInterface { 

    public function account() 
    { 
     return $this->belongsToMany('account', 'id', 'account_url_id'); 
    } 
} 

所以我從與account_urls登錄的用戶與特定的工作空間中所有帳戶 是這樣想:用戶> workspace->帳戶 - > account_url

我嘗試下面的東西,但它不工作:

$account_urls = user::find(Auth::user()->id)->first()->workspaces()->where('id', '=', 1)->account()->account_url()->select('url')->get(); 

和:

$account_urls = account::where('workspace_id', '=', '1')->account_url()->select('url')->get(); 

只有當我不喜歡這樣寫道:

$account_urls = account::find(1)->account_url()->select('url')->get(); 

但後來我只得到1個URL,但是當我replase發現(1)所有()我得到一個錯誤?

有人能幫助我嗎?

坦克,

回答

0

你的關係是錯誤的,他們更改爲:

// User 
public function account() 
{ 
    return $this->hasManyThrough('Account', 'Workspace', 'user_id', 'workspace_id'); 
} 

// Account 
// use camelCase for relations 
public function accountUrl() 
{ 
    // I assume you have account_url_id on accounts table 
    // If it's opposite, then use hasOne 
    return $this->belongsTo('AcountUrl', 'account_url_id', 'id'); 
} 

// AccountUrl (use camelCase) 
public function account() 
{ 
    // if above is hasOne, then here belongsTo instead. 
    return $this->hasOne('account', 'account_url_id', 'id'); 
} 

現在,取模型:

// this part is .. amazing ;) 
user::find(Auth::user()->id)->first(); 

// it does this: 
Auth::user()->id // fetch user and get his id 
user::find(..) // fetch user with given id, you have this user already above... 
->first() // fetch first row from users table (not the one with id provided before) 

讓你想:

$account_urls = Auth::user()->workspaces() 
    ->where('id', '=', 1)->first() // first fetches the result 
    // or simply 
    // ->find(1) 
    ->accounts()->first()->accountUrl() 
    ->pluck('url'); // this does 'SELECT url' and returns only this field instead of model 

剛請記住:

$user->workspaces 
$workspace->accounts 

這些是集合,所以你不能調用它們的任何模型,你需要先獲得單一模型。

+0

tnx爲您的重播,我幾乎得到它, 您的代碼的作品,但現在我只得到1個網址,因爲我得到第一個工作區。但有可能我在一個工作區有多個帳戶。我應該怎麼做? 我以爲我應該把第一個()換成all(),但後來我得到一個錯誤? – 2014-11-22 15:33:40

+0

你不能得到所有'accountUrl's,因爲它是一個'Accounts'的集合。取而代之的是'first'去'get',它會返回集合,然後使用'foreach'來獲得url。並閱讀文檔,他們幾乎都是你需要的.. – 2014-11-22 17:29:35

+0

好的tnx的幫助! – 2014-11-22 17:54:23