2016-11-14 2 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() не работает. Есть идеи?

EDIT На самом деле 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

вы можете отключить или удалить атрибут 'описания' каждого элемента в закрытии карты до' return $ item' – Morilog

+0

Звучит как обходной путь, но это классно, отлично! Спасибо чувак! – EBuzila

0

Вы не можете сделать это, но вы можете использовать first() на коллекции позже, например, в целях:

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

Хорошо, хорошо прийти, если честно не я может это сделать. Но для меня это работает с -> описаниями() -> 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

Смежные вопросы