0

「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 にはタグリストが含まれていません (実際には空です)

4

2 に答える 2

0

次のように実行できます(Eager Loading

型式:(例)

class Example extends Eloquent {
    public function tags()
    {
        return $this->hasMany('Tag');
    }
}

今クエリ:

$examples = Example::with(array('tags' => function($query)
{
    $query->where('name', '=', 'someName');
}))->get();

アップデート :

$examples = $examples->filter(function($example) {
    $tags = $example->tags->toArray();
    return in_array(Input::get('tag'), $tags ) ?: FALSE;
});
于 2013-06-24T06:41:37.610 に答える
0

すべきことは、結合を作成してから、必要なものに where 句を作成することです。タグでフィルタリングする方法に応じて、次のようにすることができます。

最初に有効なタグ ID を取得します。

$tagIDs = array_pluck(Tag::whereIn('name', array(
    'tag1',
    'tag2',
    'tag3',
))->toArray(), 'id');

次に、例を tag_id でフィルタリングします。

return Example::select('examples.*')
    ->join('examples_has_tags', 'examples.id', '=', DB::raw('examples_has_tags.example_id'))
    ->whereIn(DB::raw('examples_has_tags.tag_id'), $tagIDs)
    ->get();

これを行うにはもっと効率的な方法があるかもしれません (そしておそらくあるでしょう) が、これが私がアプローチする方法です。

于 2013-06-24T10:26:25.857 に答える