2016-06-05 2 views
0

У меня есть база данных 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 не должен рассматриваться таким образом).

Каков правильный способ получить эту информацию?

+0

Я думаю, что есть несколько базовых подходов, которые вы могли бы сделать. Tag :: get() вернет объект коллекции типа «\ Illuminate \ Support \ Collection», в котором есть много функций, которые вы можете использовать. Возможно, вы можете использовать следующее в своем if: $ selected-> где ('id', $ tag-> id) Кроме того, вы можете играть с данными, прежде чем вводить свою функцию. Что-то вроде этого, в зависимости от вашей версии Laravel: Tag :: whereNull ('tag_id') -> get (['id']) -> pluck ('id); – mattcrowe

+0

@mattcrowe Как ни странно, я действительно понял это, прежде чем заметил ваш комментарий. Я обнаружил, что существует множество методов, которые можно использовать с коллекцией, и я успешно использовал 'contains' для решения моей проблемы. – Forest

ответ

0

Это потому, что $ выбран не должен рассматриваться именно так

Тогда как это имеет отношение решить? Конечно, ответ лежит там сам, поскольку вы полагаетесь на $ selected для проверки того, какие теги были выбраны.

В соответствии с Вашим комментарием, следующий должен решить вашу проблему

Измените ваше, если условие из этого -

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

В этом -

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

Это, к сожалению, не помогает. Проблема заключается в том, что не существует '$ selected [$ tag-> id]', '$ selected' - это просто массив, начинающийся с 0, и не связан с идентификатором. Я пытаюсь найти способ найти, если '$ tag-> id' находится в объекте' $ selected'. – Forest

+0

Проверьте обновленный ответ. Надежда, которая решает проблему. Вы можете обратиться к документации array_in() здесь: http://php.net/manual/en/function.in-array.php –

+0

Спасибо за вашу помощь, но, к сожалению, он не работал, потому что я пытался использовать обычные методы массива и объектов в коллекции Laravel. Я провел некоторое исследование и обнаружил, что есть специальный метод для поиска этих данных! – Forest

0

Я нашел решение функционирующий с использованием Collections API в Laravel, используя contains.

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

Это, кажется, самый удобный способ поиска данных, и он отлично функционирует в моем приложении.

Смежные вопросы