У меня есть база данных Laravel со столом для tags
, таблица для items
и таблица для item_tag
. Теги являются иерархическими, и в результате я пытаюсь запросить, какие теги были установлены внутри цикла.Проверка, если что-то установлено с помощью сводной таблицы Laravel
Это просто, я просто использую $item->tags
, и он дает мне теги в доступном объекте, готовом к прохождению.
Проблема возникает, когда я хочу проверить, установлен ли какой-либо конкретный объект при отображении списка всех тегов. Я использую следующий код для тестирования:
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-> где ('id', $ tag-> id) Кроме того, вы можете играть с данными, прежде чем вводить свою функцию. Что-то вроде этого, в зависимости от вашей версии Laravel: Tag :: whereNull ('tag_id') -> get (['id']) -> pluck ('id); – mattcrowe
@mattcrowe Как ни странно, я действительно понял это, прежде чем заметил ваш комментарий. Я обнаружил, что существует множество методов, которые можно использовать с коллекцией, и я успешно использовал 'contains' для решения моей проблемы. – Forest