2016-11-14 10 views
1

私はLaravel 5.2one-to-many relationを持っており、モデルに戻って関係に条件を付したいと思います。 私はこれを試してみた:Laravel条件付き関係:返品first()

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

それは私がちょうど何かをしたい、正常に動作:関係は、コレクションや配列、単純なオブジェクトをすべきではありません。私はこのケースでfirst()が動作していない、

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

のような何かをしたいです。何か案は?実際first()が正常に動作していない

EDIT 、それが第一の目的は、それが何も返さない他人のために、返されたばかりのための最初の説明を返します。

答えて

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

非常に興味深いことに、ちょっとした変更です.1つの説明と説明の両方を返します。私は説明を取り除くことができますか? – EBuzila

+0

'return $ item'の前にmap closureで各項目の' descriptions'属性を設定解除または空にすることができます – Morilog

+0

回避策のような音ですが、完璧です!ありがとう! – EBuzila

0

あなたはそれを行うことはできませんが、あなたがビューで、たとえば、後でコレクションにfirst()を使用することができます。

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

[OK]を、良いenought、正直、私はしませんでしたそれを行うことができます。しかし、私にとっては、> - > 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