2015-02-11 77 views
0

這些的同名領域是我有型號:Laravel hasManyThrough問題與表

class User extends Eloquent 
{ 
    public function categories() 
    { 
     return $this->hasMany('Category'); 
    } 
    public function forms() 
    { 
     return $this->hasManyThrough('App\Models\Form', 'Category'); 
    } 
} 

class Category extends \Eloquent { 
    public function user() 
    { 
     return $this->belongsTo('User'); 
    } 
    public function forms() 
    { 
     return $this->hasMany('App\Models\Form'); 
    } 
} 

namespace App\Models; 
class Form extends \Eloquent { 
    public function category() 
    { 
     return $this->belongsTo('Category'); 
    } 
} 

現在我想通過它id一個Form,使其放心,FormbelongsTo特定User

所以我使用:

$form = $user->forms()->find($id); 

它工作正常,但這裏附帶了其顯示Category問題。 name而不是顯示Formname。我知道它是因爲這兩張表都有名爲name的字段。我可以更改字段名稱,但它不是一個好的解決方案。

如何以最佳方式擺脫此問題?

回答

1

我看到那裏的錯誤。 find()方法的第二個參數是要檢索的列的列表。如果您不傳入此值,則默認爲「array(*)」。因此,當您做$user->forms()->find($id);時,它將用select * ...替換原來的select forms.*, categories.user_id ...。這也發生在first()方法中。

這種情況也會發生在get()方法中,但HasManyThrough關係覆蓋了get()方法,因此當所有選擇的值都是「array(*)」時,它會添加正確的選擇值。

所以,你的解決方案應該可以正常工作。但是,您不需要whereRaw; where應該很好地工作:

$forms = $user->forms()->where('forms.id', $id)->get(); 

一旦你的收藏,你是安全的,在收集用first(),所以你可以這樣做,以及:

// first() on the Collection is fine; first() on the HasManyThrough relationship is not. 
$form = $user->forms()->where('forms.id', $id)->get()->first(); 
0

這是當前解決方案:

$form = $user->forms()->whereRaw('forms.id = ?', array($id))->get()->first(); 

這是舊的錯誤的解決方法通過使用->first()

​​

+1

我覺得你有一個不同的問題。 find()已經做了first()。你提出的語句相當於:'$ user-> forms() - > where('id','=',$ id) - > first() - > first()'。 – patricus 2015-02-11 18:48:44

+0

@patricus你是正確的問題是在別的地方。我將刪除這個答案。你有什麼建議嗎? – itsazzad 2015-02-12 01:46:47

+1

那麼,你必須做更多的事情來證明你確實有問題。由hasManyThrough關係生成的查詢不會從中間表中選擇字段,所以它沒有任何意義,它會顯示來自該表的數據。您可以通過轉儲使用'var_dump(DB :: getQueryLog());'運行的查詢來驗證這一點。 – patricus 2015-02-12 01:58:32