Php 拉威尔:我试图在一个查询中获得两个关系方法
我想做的是让我的电视和电影在课堂上认真对待 这是我的分类课:Php 拉威尔:我试图在一个查询中获得两个关系方法,php,laravel,laravel-5,Php,Laravel,Laravel 5,我想做的是让我的电视和电影在课堂上认真对待 这是我的分类课: class Category extends Model { public function movies() { return $this->hasMany(Movie::class); } public function tvserious() { return $this->hasMany(Tvserious::class); } 我试过了,它起作用了 public function Categ
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,
]);
}
这种方式的问题是在我的刀片中,我必须为电影和TVCrease创建一个循环,TVCrease数据将始终保留在结尾,在电影循环结束后显示
@foreach($catclick as $media)
@foreach($media->movies as $movie )
{{ $movie->title }}
@endforeach
@foreach($media->tvserious as $tvserious )
{{ $tvserious->title }}
@endforeach
@endforeach
那么,我怎样才能把我的电影和《我的刀锋》中的严肃电影混合在一起呢
我不希望一开始所有的电影都是这样,那么问题出在哪里?我如何解决这个问题?您可以使用此代码
@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
@php
$moviescont=$media->movies->count();
$tvseriousCount=$media->TVSEREAR->count();
$maxCount=($tvseriousCount>$moviesCount)$tvseriousCount:$moviescont;
@endphp
@对于($index=0;$index<$maxCount;$index++)
@isset($media->movies[$index])
{{$media->movies[$index]->title}
@尾端集
@isset($media->tvSevery[$index])
{{$media->tvSevery[$index]->title}
@尾端集
@结束
在您的类别中添加一个
型号:
class Category
{
public function getMediaAttribute()
{
return $this->movies->values()->toBase()
->merge($this->tvserious->values())
->sortByDesc(function ($media, $key) {
return $media->updated_at;
});
}
}
在这里,我们使用了一个基本集合而不是Eloquent集合,因为将问题与Eloquent集合合并(它不允许重复键,感谢@lagbox指出这一点)。将这两种媒体类型合并在一起后,我们还将根据它们的上次更新对结果列表进行排序。这意味着最近接触的条目将首先列出
可以使用
$category->media
访问新创建的列表。除了sortByDesc($func)
之外,一个简单的sortBy('column')
或shuffle()
(获取随机顺序)也可以工作。这对我来说非常有效#首先
我在分类类中创建了一个访问器
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我不会那么快将不同型号的雄辩集合合并在一起。。。如果电影和电视节目具有相同的
id
,则其中只有一个将保留为有说服力的集合,使用按模型实例键键入的字典。。。你可以合并一个没有问题的基本集合,尽管它是有效的,但是TVserior将始终位于结果的末尾。。。。这意味着所有的电影都会在之后出现,它将开始列出TVSerious,这就是shuffle通过应用随机顺序来解决的问题。我用一些代码更新了答案,其中考虑了@lagbox所描述的问题,并添加了更好的解释和一个如何在集合中获得新订单的示例。您应该能够调用$collection->toBase()
获取支持集合以缩短该小比特数为什么我不能使用上述查询分页?!有没有办法解决这个问题?