【问题标题】:Checking if something is set using a Laravel pivot table检查是否使用 Laravel 数据透视表设置了某些内容
【发布时间】:2016-06-05 18:38:13
【问题描述】:

我有一个 Laravel 数据库,其中有一个tags 的表,一个items 的表和一个item_tag 的表。标签是分层的,因此,我试图查询在循环中设置了哪些标签。

这很简单,我只使用$item->tags,它会在可访问对象中提供我的标签,准备循环。

当我想检查是否设置了特定对象时,当显示 all 标记列表时,就会出现问题。我正在使用以下代码进行测试:

function buildTree($tags, $selected = null) {
    echo "<ul>";
        foreach($tags as $tag) {
            echo "<li>";
                if($selected[$tag->id]) {
                    echo "<strong>";
                }
                echo $tag->name;
                if($selected[$tag->id]) {
                    echo "</strong>";
                }
                if($tag->children) {
                    buildTree($tag->children);
                }
            echo "</li>";
        }
    echo "</ul>";
}
$item = Item::find(1);
$tags = Tag::whereNull('tag_id')->get();
buildTree($tags, $item->tags);

预期的输出是每个被选中的标签都会在树中显示为粗体。当然,如果发生这种情况,我不会发布这个。相反,它只是突出显示树中的第一个项目,即使它没有被选中。 (那是因为 $selected 不应该这样处理)。

获取此信息的正确方法是什么?

【问题讨论】:

  • 我认为您可以采用几种基本方法。 Tag::get() 将返回一个“\Illuminate\Support\Collection”类型的集合对象,它有很多可以利用的功能。也许,您可以在 if 子句中使用以下内容: $selected->where('id', $tag->id) 此外,您可以在引入函数之前使用数据。像这样,取决于你的 Laravel 版本: Tag::whereNull('tag_id')->get(['id'])->pluck('id);
  • @mattcrowe 有趣的是,在我注意到您的评论之前,我实际上已经想通了。我发现有很多方法可以与 Collection 一起使用,我成功地使用contains 解决了我的问题。

标签: php mysql laravel eloquent hierarchy


【解决方案1】:

那是因为 $selected 不应该这样处理

那该如何解决呢?当然,答案就在那里,因为您依靠 $selected 来检查选择了哪些标签。

根据您的评论,以下应该可以解决您的问题

从此更改您的 if 条件 -

if($selected[$tag->id])

到这里-

if(array_in($tag->id, $selected))

【讨论】:

  • 不幸的是,这没有帮助。问题在于没有$selected[$tag-&gt;id]$selected只是一个从0开始的数组,与ID无关。我正在尝试找到一种方法来查找 $tag-&gt;id 是否在 $selected 对象中。
  • 请查看更新后的答案。希望能解决问题。您可以在这里参考 array_in() 文档:php.net/manual/en/function.in-array.php
  • 感谢您的帮助,但不幸的是它不起作用,因为我在 Laravel 集合上尝试了常规数组和对象技术。我做了一些研究,发现有一种专门的方法可以找到这些数据!
【解决方案2】:

我找到了一个在 Laravel 中使用 Collections API 的有效解决方案,利用 contains

if($selected != null && $selected->contains('id', $tag->id))

这似乎是查找数据最方便的方法,并且在我的应用程序中完美运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-11
    相关资源
    最近更新 更多