У меня есть ниже определения отношений:
Сообщение:
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 все сообщения для категорий загружаются!
Буду очень признателен за помощь. Не могу понять, почему это происходит.
Там нет необходимости ставить ->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();
Других решений пока нет …