Я использую Laravel 5.1, и мне нужно ограничить количество связанных записей, которые я вытягиваю, используя полиморфные отношения "многие-ко-многим" .
То, что я хотел бы сделать, это получить список категорий по parent_id. Для каждой категории я бы хотел только потянуть четыре сообщения.
У меня есть работа с кодом ниже, но это приводит к кучке дополнительных запросов. Я хотел бы просто нажать базу данных один раз, если это возможно. Я бы хотел использовать Laravel/Eloquent framework, если это вообще возможно, но я открыт для того, что работает на этом этапе.
@foreach ($categories as $category)
@if ($category->posts->count() > 0)
<h2>{{ $category->name }}</h2>
<a href="/style/{{ $category->slug }}">See more</a>
{-- This part is the wonky part --}
@foreach ($category->posts()->take(4)->get() as $post)
{{ $post->body }}
@endforeach
@endif
@endforeach
PostsController
public function index(Category $category)
{
$categories = $category->with('posts')
->whereParentId(2)
->get();
return view('posts.index')->with(compact('categories'));
}
База данных
posts
id - integer
body - string
categories
id - integer
name - string
parent_id - integer
categorizables
category_id - integer
categorizable_id - integer
categorizable_type - string
Модель публикации
<?php namespace App;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
public function categories()
{
return $this->morphToMany('App\Category', 'categorizable');
}
Модель категории
<?php namespace App;
use Illuminate\Database\Eloquent\Model;
class Category extends Model
{
public function category()
{
return $this->belongsTo('App\Category', 'parent_id');
}
public function subcategories()
{
return $this->hasMany('App\Category', 'parent_id')->orderBy('order', 'asc');
}
public function posts()
{
return $this->morphedByMany('App\Post', 'categorizable');
}
Я видел несколько ссылок на это в Интернете, но ничего, что действительно сработало для меня.
Я пробовал это решение без везения.
$categories = $category->with('posts')
->whereParentId(2)
->posts()
->take(4)
->get();
Я рассмотрел это решение от Jarek в SoftOnTheSofa, но это для отношений hasMany, и, честно говоря, немного выше моего уровня sql для меня, чтобы адаптировать это для моих нужд.
Изменить
Я добавил github repo для этой настройки, если это полезно кому-либо.