【问题标题】:Operetion on child collection对子集合的操作
【发布时间】:2019-12-25 20:45:30
【问题描述】:

我有这样的代码

$tag = Tag::where('slug' = $slug)->first();
$posts = $tag->posts;

它可以正常工作,但我想在帖子上使用limit、orderBy、offset和其他操作。所以它有效

$posts = $tag->posts->where('accept', 1);

但它不起作用

    $posts-> $tag->posts->orderBy('created_at', 'desc');
//or
    $posts-> $tag->posts
                 ->offset($offset)
                 ->limit($limit);

我必须在 var 的查询中使用偏移量和限制。 我该怎么做?

【问题讨论】:

  • 它会抛出任何错误吗?你怎么知道它不起作用?

标签: php mysql laravel relationship


【解决方案1】:

当您设置初始查询Tag::where('slug' = $slug)->first(); 时,您正在使用查询生成器及其方法。但是当 Laravel 返回结果时,它们会作为一个 collction 对象返回——它们有非常相似但略有不同的可用方法。 https://laravel.com/docs/5.8/collections#available-methods

在集合或其子集合上,您可以使用 sortBy() 或 sortByDesc() 而不是 orderBy()。这些将返回集合的一个实例,按您指定的键排序。 $results = $posts->sortBy($sorting);

与limit相同的想法,在这种情况下你可以使用splice方法。 (集合基本上是类固醇上的 php 数组) Splice 接受两个参数,一个起始索引和一个限制。因此,要仅获取前 10 个项目,您可以这样做: $results = $posts->splice(0, 10);

当然,您也可以将它们链接为$results = $tag->posts->sortBy('id')->splice(0, 10);

【讨论】:

    【解决方案2】:

    当您使用子查询时,Eloquent 创建另一个子查询,然后将结果添加到父查询,这样就无法正确排序。

    一个解决方案可能是连接表:

    $tags = Tag::where('tags.slug' = $slug)
        ->join('tags', 'tag.post_id', '=', 'posts.id')
        ->orderBy('posts.created_at', 'desc')
        ->select('tags.*')
        ->get();
    

    【讨论】:

      猜你喜欢
      • 2018-08-21
      • 2021-04-17
      • 1970-01-01
      • 1970-01-01
      • 2017-02-17
      • 1970-01-01
      • 2023-03-08
      • 2011-03-04
      • 1970-01-01
      相关资源
      最近更新 更多