Фильтр Laravel активно загружается с помощью take (), который не работает должным образом

У меня есть ниже определения отношений:

Сообщение:

class Post extends Model
{
use SoftDeletes;

protected $fillable = ['title','content','category_id','featured_image','slug'];
protected $dates = ['deleted_at'];

public function category()
{
return $this->belongsTo('App\Category');
}

public function tags()
{
return $this->belongsToMany('App\Tag')->withTimestamps();
}

}

Категория:

class Category extends Model
{

public function posts()
{
return $this->hasMany('App\Post');
}
}

В индексной функции моего контроллера я пытаюсь получить топ 3 категории (по количеству постов) с их топ 3 последними постами. Я сделал ниже, который работает хорошо, пока я не включая внутренний принимать метод:

$cats_and_posts = Category::with(['posts'=>function($query){
$query->orderBy('updated_at','desc')->take(3)->get();
}])->withCount('posts')->orderBy('posts_count','desc')->take(3)->get();

Если я включу внутренний принимать метод, некоторые категории загружаются с пустыми сообщений связь. вот что dd создает для переменной «cats_and_posts»:

 #items: array:3 [▼
0 => Category {#261 ▶}
1 => Category {#260 ▶}
2 => Category {#243 ▼
#connection: null
#table: null
#primaryKey: "id"#keyType: "int"#perPage: 15
+incrementing: true
+timestamps: true
#attributes: array:5 [▶]
#original: array:5 [▶]
#relations: array:1 [▼
"posts" => Collection {#269 ▼
#items: []
}
]
#hidden: []
#visible: []
#appends: []
#fillable: []
#guarded: array:1 [▶]
#dates: []
#dateFormat: null
#casts: []
#touches: []
#observables: []
#with: []
+exists: true
+wasRecentlyCreated: false
}
]
}

Без внутреннего метода take все сообщения для категорий загружаются!

Буду очень признателен за помощь. Не могу понять, почему это происходит.

1

Решение

Там нет необходимости ставить ->get() в подзапросе для отношения.

$cats_and_posts = Category::with([
'posts' => function ($query) {
$query->orderBy('updated_at', 'desc')
->take(3);
}
])
->withCount('posts')
->orderBy('posts_count', 'desc')
->take(3)
->get();
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]