2016-11-14 72 views
1

我有一個Laravel 5.2one-to-many relation我想返回模型並將關係條件。 我已經試過這樣:Laravel有條件關係:首先返回()

$categories = Category::with(['descriptions' => function($d) use ($default_language) { 
    $d->where('language_id', $default_language->id); 
}])->get(); 

它做工精細,我只是想別的東西:關係不應該是一個集合或數組,只是一個簡單的對象。我想要做類似

$d->where('language_id', $default_language->id)->first(); 

,就在這種情況下first()不起作用。有任何想法嗎?

編輯 其實first()不能正常工作,它返回只是第一個對象返回的第一描述,對其他人而言,返回任何結果。

回答

1

試試這個:

$categories = \Jobinja\CMS\Blog\Models\Category::with([ 
     'descriptions' => function ($q) use ($defaultLanguage) { 
      return $q->where('language_id', $defaultLanguage->id)->take(1); 
     } 
    ]) 
    ->get() 
    ->map(function ($item) { 
      if ($item->descriptions->isEmpty() === false) { 
       $item->description = $item->descriptions->first(); 
      } 

      return $item; 
    }); 

,並獲得描述:

foreach ($categories as $category) { 
    $description = $category->description; 
} 
+0

嗯,非常有趣,只是一個小小的變化:它返回一個描述和描述。我可以擺脫描述嗎? – EBuzila

+0

您可以在返回$ item之前取消或清空地圖封閉中每個項目的'descriptions'屬性。 – Morilog

+0

聽起來像一種解決方法,但它很酷,完美地工作!謝啦! – EBuzila

0

你不能這樣做,但你可以在視圖上集合使用first()後,例如:

@foreach ($categories as $category) 
    {{ $category->descriptions->first()->name }} 
@endforeach 
+0

好吧,足夠多的好,的確不是我可以做到這一點。但對我來說,它適用於 - > descriptions() - > first();問題是,這個API返回,我稍後使用,所以它仍然會令人困惑,其他人返回數組... – EBuzila

0

我可以說,而不是使用first()find()並給它language_id$default_language->id和這將嘗試在表格中找到第一列id並分配值。如果您有不同的ID列名稱,請將其發送至find(['your_column_name' => '<your_value'])

如果你想數組類似於 - > toArray()。您可以在修補程序中測試不同的場景。 php artisan tinker

這裏就是記錄這一個環節 - >https://laravel.com/docs/5.3/eloquent#retrieving-single-models