2015-07-28 3 views
2

у меня есть:Laravel получить модель с первым элементом из соотношения

public function getThumbnail($id) { 
    $thumbnail = Product::find($id); 
    if($thumbnail) { 
     return $thumbnail->with('images')->get(); 
    } else { 
     return response()->json('That cake does not exist.'); 
    } 
} 

Который возвращает продукт с любыми изображениями придают ей.

Однако, я бы хотел, чтобы он возвращал только изображения с надписью «primary». Что-то вроде этого (pseudo):

return $thumbnail->with('images->isPrimary')->get(); 

Как я могу это достичь?


насчет:

return $thumbnail->with(['images' => function ($query) { 
      $query->where('is_primary', 1); 
     }])->get(); 

ответ

3

Вы должны использовать оператор whereHas для того, чтобы получить все Products, которые имеют по крайней мере один primary изображение, как показано ниже:

$thumb = Product::whereHas('images', function ($query) { 
    $query->where('primary', 'true'); 
})->get(); 

Подробнее о запрашивая Отношения here.


UPDATE

После нахождения вашего Product по id, если вы просто хотите, чтобы показать изображения, которые primary, вы можете использовать Query Scopes:

В вашем Image классе:

public function scopePrimaries ($query) { 
    return $query->where('is_primary', 1); 
} 

Итак, вы можете f травить их, как это:

$primaryThumbs = $product->images()->primaries()->get(); 
+0

Имейте в виду, что если в «Продукте» нет прикрепленных миниатюр, которые являются первичными, это решение не будет включать этот «Продукт» в результаты. – user3158900

+0

@JoaquinLRobles В чем разница между вашим решением и моим редактированием? – imperium2335

+0

Btw это возвращает каждый продукт с изображением, моя функция принимает $ id, поэтому мне нужна find(). – imperium2335

0

Я сделал это, который, кажется, работает:

public function getThumbnail($id) 
{ 
    $thumb = Product::find($id); 
    if ($thumb) { 
     return $thumb->with(['images' => function ($query) { 
      $query->where('is_primary', 1); 
     }])->whereHas('images', function ($query) { 
      $query->where('is_primary', 1); 
     })->get(); 
    } else { 
     return response()->json([]); 
    } 
} 

Есть более простой способ?

+0

см. Мое редактирование с помощью области запросов, это правильный способ! –

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