【问题标题】:load articles with the included tags of the group加载包含该组标签的文章
【发布时间】:2018-09-19 17:30:58
【问题描述】:

我想在一个组中显示与该组具有相同标签的所有文章。 例如:

该组有 as 标签:laravel、php、html。然后我想让所有的文章,它有完全相同的标签。所以所有标签为 laravel、php、html 的文章。

并非所有文章都只有一个相同的标签,只有文章具有所有相同的标签。 $tagIdArray 是组的标签。

我试过这段代码:

 $tagIdArray = [2,3,4];
                $article = Article::with('comments', 'tags')->whereIn('privacy', [1, 2])->where('status', 1)
                    ->where(function ($query) use ($tagIdArray) {
                        return $query->tags->pluck('id')->all() == $tagIdArray;
                    })
                    ->latest()->paginate(15);

但我总是收到错误消息:

Undefined property: Illuminate\Database\Eloquent\Builder::$tags

后模型

  public function tags()
        {
            return $this->morphToMany('App\Tag', 'taggable')->withTimestamps();
        }

标签模型

public function taggable()
    {
        return $this->morphTo();
    }

可标记模型

public function tag()
    {
        return $this->belongsTo('App\Tag');
    }

编辑:

例如,如果我显示所有组并且我想使用文章的随机图像作为组图像。我如何最好地实现这一点?

@foreach ($groups as $group)
{{$group->name}}                      
<img src="-----load random picture from articles that is in this group------" alt="" />
@endforeach

【问题讨论】:

  • 你能发布文章和标签模型吗?
  • 我已经更新了我的问题

标签: arrays laravel undefined


【解决方案1】:

以下方法可以解决问题:

$tagIdArray = [2,3,4];
$article = Article::with('comments', 'tags')
  ->whereIn('privacy', [1, 2])
  ->where('status', 1)
  ->whereHas('tags', function($query) use ($tagIdArray) {
    $query->whereIn('id', $tagIdArray);
  }, '>=', count($tagIdArray))
  ->latest()
  ->paginate(15);

whereHas() 允许您仅过滤具有与回调(第二个参数)定义的约束匹配的相关模型(第一个参数)的模型。

除此之外,您可以说出与给定约束相匹配的相关模型返回的模型应该有多少 - 这是最后两个参数所做的。上面的代码将返回至少在 $tagIdArray 中具有 ID 的所有标签的文章 - 它还将包括具有比提供的 3 个标签更多的标签的文章。如果您想返回包含所有且仅包含 $tagIdArray 中提供的标签的文章,请将 >= 运算符替换为 =

【讨论】:

  • 我可以直接在刀片模板中使用它吗?
  • 好吧,如果你有办法在模板中运行 PHP 代码,你可以运行任何你喜欢的 PHP 代码。但是你为什么要把它放在模板中呢?这种方式很难重用。至少我会在文章模型中创建一个静态方法,然后从模板中调用它。
  • 我在我的问题中添加了一个示例
  • 我将在 Group 模型中添加一个方法,该方法将使用上面的代码返回文章集合。然后,只需在此集合上调用 random() 即可获取随机文章并显示其图像。
猜你喜欢
  • 1970-01-01
  • 2019-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多