「examples」テーブル、「tags」テーブル、中間の「examples_has_tags」テーブルがあります。したがって、1 つの例にいくつかのタグを含めることができ、1 つのタグがいくつかの例に属することができます。
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();
$examples にはタグリストが含まれていません (実際には空です)