У меня есть таблица «примеров», таблица «теги» и промежуточная таблица «examples_has_tags». Таким образом, один пример может иметь некоторые теги, и один тег может принадлежать некоторым примерам.Laravel 4 filter relationship
В index.php Я показываю все примеры и список тегов.
$examples = Example::with('tags')->where('public', true)->get();
$tags = Tag::all();
return View::make('index')->with('examples', $examples)
->with('tags', $tags);
Работает отлично. Но как я могу фильтровать примеры по имени тега? Я нашел что-то в stackoverflow: вы должны создать статический метод в классе Example, который возвращает то, что мне нужно. Но я запутался в отображении данных. В приведенном выше коде я показываю это как:
@foreach ($examples as $example)
<div class="widgetbox">
<h4 class="widgettitle">{{ $example->name }}</h4>
<div class="widgetcontent">
{{ $example->body }}
<div class="tags-list">
@foreach ($example->tags as $tag)
<span class="label label-info tag">{{ $tag->name }}</span>
@endforeach
</div>
</div>
</div>
@endforeach
Есть ли простой способ сделать это? Я нашел кое-что о коллекции фильтрации, но нет примеров
обновление
я нашел следующее решение:
$examples = $examples->filter(function($example) {
$tags = $example->tags->toArray();
foreach ($tags as $tag) {
if ($tag["name"] == Input::get('tag')) return true;
}
return false;
});
Update2
Пытался сделать это без фильтрации PHP, но я не могу получить теги, которые относятся к примеру:
$tagId = Tag::where('name', '=', Input::get('tag'))->first()->id;
$examples = Example::with('tags')
->join('examples_has_tags', 'examples_has_tags.example_id', '=', 'examples.id')
->where('examples_has_tags.tag_id', '=', $tagId)->get();
$ примеры не содержит список тегов (пусто на самом деле)
Как насчет моего альтернативного подхода (in_array), можете ли вы его проверить? –
Не работает, $ example-> tags-> toArray() возвращает не просто массив ("tagName1", "tagName2" ...), так что ... Я пробовал array_pluck, но безуспешно (не знаю, почему id didn я работаю для меня). – Victor
Работает ли ваше решение? –