Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 拉威尔:我试图在一个查询中获得两个关系方法_Php_Laravel_Laravel 5 - Fatal编程技术网

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()
获取支持集合以缩短该小比特数为什么我不能使用上述查询分页?!有没有办法解决这个问题?