【发布时间】: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