【问题标题】:Laravel 3 eloquent many-to-many relationshipLaravel 3 雄辩的多对多关系
【发布时间】:2013-01-22 10:44:44
【问题描述】:

我有一个 Post 模型和一个 Tag 模型成多对多关系。

当我收到帖子和帖子的所有标签时,我会使用它,它工作得很好:

$posts = Post::with(array('tags'))
            ->where('cat_id', '=', $cat->id)
            ->where_published(1)
            ->order_by('created_at', 'desc')
            ->paginate('10');

上面的代码显示了最新创建的帖子并对其进行分页。

我想实现同样的目标,但以另一种方式,从标签开始,获取按 created_at 列分页和排序的帖子列表。

Tag::with(array('posts'))
                ->where('tagname', '=', $tag)
                ->first();

这可行,但会显示所有帖子,我希望它们分页、排序和过滤 where_published(1)。

这可以通过 eloquent 使用预先加载来完成吗(没有预先加载我已经知道这样做但是会产生太多查询)?

我在哪里可以放置过滤器以及如何让它们分页?

【问题讨论】:

    标签: laravel eloquent laravel-3


    【解决方案1】:

    你可以这样做:

    标签::with(array('posts' => function ($query) { $query->where('已发布', '=', 1); })->where('tagname', '=', $tag) ->第一();

    然而,不幸的是,这几乎是你所能做的。目前还不支持订购和大多数其他东西 - 我解决这个问题的方法是在模型中创建一个函数,如下所示:

    公共函数posts_ordered() { return $this->has_many_and_belongs_to('Post')->order_by('your_field', 'asc'); }

    所以你将在模型中有一个正常的posts()函数,但posts_ordered也可以像这样使用:

    Tag::with('posts_ordered')->where('tagname', '=', $tag)->first();

    不幸的是,您无法将变量(据我尝试过)传递给这些函数,因此需要创建单独的变量。

    【讨论】:

      猜你喜欢
      • 2016-11-03
      • 1970-01-01
      • 1970-01-01
      • 2012-10-08
      • 2018-10-27
      • 2018-03-28
      • 1970-01-01
      • 1970-01-01
      • 2018-11-14
      相关资源
      最近更新 更多