2017-02-25 51 views
0

我試圖找回在laravel 5.3Laravel 5.3 - 的hasMany關係不加入聲明

使用的hasMany Symbol.php

public function comments() { 
    return $this->hasMany('App\Comment'); 
} 

Comment.php

徵求意見工作的符號
public function symbol() { 
    return $this->belongsTo('App\Symbol'); 
} 

當我運行:

$symbols = Symbol::with('comments')->paginate(100); 

我得到正確的輸出(列出所有符號與他們的意見)

@foreach ($symbols as $s) 
    {{ $s->name }} 
    @foreach ($s->comments as $c) 
     {{ $c->body }} 
    @endforeach 
@endforeach 

,但是當我添加一個連接到語句:

$symbols = Symbol::with('comments') 
    ->join('ranks', 'symbols.id', '=', 'ranks.symbol_id') 
    ->join('prices', 'symbols.id', '=', 'prices.symbol_id') 
    ->paginate(100); 

的foreach循環對每個符號都沒有評論。任何想法爲什麼連接會造成這種情況?

+1

爲什麼不添加這些作爲關係? – Jerodev

+1

「任何想法爲什麼連接會造成這種情況」 - 我想Symbol的'id'被等級或價格的id覆蓋。解決方案將取決於你想要做什麼。 –

+0

我認爲這是錯誤的。當我添加一個選擇,只包含symbols.id它的工作。謝謝 – StackOverflower

回答

1

當你正在做這樣的連接時,如果沒有選擇,具有相同名稱的屬性將被覆蓋。因此,選擇您的代碼所需的屬性,而不是別的。如下所示。

$symbols = Symbol::with('comments') 
    ->join('ranks', 'symbols.id', '=', 'ranks.symbol_id') 
    ->join('prices', 'symbols.id', '=', 'prices.symbol_id') 
    ->select('symbols.*', 'ranks.importantAttribute', 'prices.importantAttribute') 
    ->paginate(100); 

Basicly我覺得你的ID被改寫,由兩個連接,因爲他們也有ID字段,我也有過類似的問題做連接,並且如果ID覆蓋它打破關係。

而且你必須小心謹慎,所有共享姓名的字段都可以被覆蓋並且被錯誤地分析到模型中。