我想做的是从分类类中获取电视和电影
这是我的类别课程:
class Category extends Model
{
public function movies()
{
return $this->hasMany(Movie::class);
}
public function tvserious()
{
return $this->hasMany(Tvserious::class);
}
我尝试过的方法并能正常工作
public function CategoryClick($slug){
$media = Category::where('slugid',$slug)->with(['movies' => function($query) {
$query->whereNotNull('title');
},'tvserious' => function($query) {
$query->whereNotNull('title');
}])->inRandomOrder()->paginate(8);
return view('test')->with([
'catclick'=>$media,
'title'=>$slug,
]);
}
这种方式的问题是在我的刀片中,我必须为电影和电视广告创建循环,电视数据将始终停留在结尾,并在电影循环结束后显示
@foreach($catclick as $media)
@foreach($media->movies as $movie )
{{ $movie->title }}
@endforeach
@foreach($media->tvserious as $tvserious )
{{ $tvserious->title }}
@endforeach
@endforeach
那么我该如何将我的电影和严肃电影融合在一起
我不希望一开始就看所有电影,所以问题出在哪里,我该如何解决?
答案 0 :(得分:1)
这对我来说效果很好... #first
我在类别类别中创建了访问器
public function getMediaAttribute()
{
return $this->movies->values()->toBase()
->merge($this->tvserious->values())
->sortByDesc(function ($media, $key) {
return $media->updated_at;
});
}
然后在我的控制器中
这是我的控制器功能
use Illuminate\Pagination\LengthAwarePaginator as Paginator;
public function CategoryClick($slug){
$all = Category::where('slugid',$slug)->first()->getMediaAttribute(); // calling the accessor
//然后使用以下代码对结果进行分页:
$perPage = 10;
$currentPage = app('request')->get('page') ?: 1; // or $request->get('page') if available
$paginator = new Paginator($all, $all->count(), $perPage, $currentPage);
return (dd($paginator));
对于帮助我解决第四个问题的所有人来说,现在一切都很好:D
答案 1 :(得分:0)
您可以使用此代码
@php
$moviesCount = $media->movies->count();
$tvseriousCount = $media->tvserious->count();
$maxCount = ($tvseriousCount > $moviesCount) ? $tvseriousCount : $moviesCount;
@endphp
@for ($index = 0; $index < $maxCount; $index++)
@isset($media->movies[$index])
{{ $media->movies[$index]->title }}
@endisset
@isset($media->tvserious[$index])
{{ $media->tvserious[$index]->title }}
@endisset
@endfor
答案 2 :(得分:0)
将accessor添加到您的.json()
模型中:
res.json({
message: 'something',
error: (err && err.message) || 'Not available',
})
这里,由于Eloquent集合存在合并问题,我们使用了基本集合而不是Eloquent集合(不允许重复的键,感谢@lagbox指出)。将两种媒体类型合并在一起后,我们还将根据它们的最新更新对结果列表进行排序。这意味着最近触摸的条目将首先列出。
可以使用Category
访问新创建的列表。代替class Category
{
public function getMediaAttribute()
{
return $this->movies->values()->toBase()
->merge($this->tvserious->values())
->sortByDesc(function ($media, $key) {
return $media->updated_at;
});
}
}
,也可以使用简单的$category->media
或sortByDesc($func)
(以得到随机顺序)。