laravel:我试图在1个查询中获得2个关系方法

时间:2018-07-25 21:26:04

标签: 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 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

那么我该如何将我的电影和严肃电影融合在一起

我不希望一开始就看所有电影,所以问题出在哪里,我该如何解决?

3 个答案:

答案 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->mediasortByDesc($func)(以得到随机顺序)。