【问题标题】:Querying many to many relation laravel查询多对多关系laravel
【发布时间】:2015-09-29 22:00:30
【问题描述】:

我正在尝试使用 Laravel 5 eloquent 查询多对多关系,使用数据透视表,im trying to retrieve only "articles" that has tag "A" and tag "B" together, but not succeed, eloquents 带来了带有标签“A”和标签“B”的文章,有什么方法可以做到这一点?没有任何效果。

$tags = [1,2,3];  
$result = Timetable::with([
    'tags' => function($query) use($tags){
        foreach($tags as $tag) {
            $query->where('id', $tag);
        }
    }
])->paginate();

$result = Timetable::with(['tags'])
                    ->whereHas('tags' => function($query) use($tags){
                            $query->whereIn('tag_id',$tags);
                    }
                )->paginate();

【问题讨论】:

    标签: mysql laravel eloquent


    【解决方案1】:

    假设您遵循 Laravel 的关系和外键命名规则:

    获取具有任何标签的时间表

    $result = Timetable::with('tags')->whereHas('tags', function($query) use ($tags) {
        $query->whereIn('tag_id', $tags);
    })->paginate();
    

    获取包含所有标签的时间表(不接受其他标签)

    $result = Timetable::with('tags')->whereHas('tags', function($query) use ($tags) {
        $query->whereIn('tag_id', $tags);
    }, '=', count($tags))->paginate();
    

    获取包含所有标签但也可能包含其他标签的时间表

    $result = Timetable::with('tags')->whereHas('tags', function($query) use ($tags) {
        $query->whereIn('tag_id', $tags);
    }, '>=', count($tags))->paginate();
    

    同上,但从结果中排除不匹配的标签

    $result = Timetable::with(['tags' => function($query) use ($tags) {
        $query->whereIn('tag_id', $tags);
    }])->whereHas('tags', function($query) use ($tags) {
        $query->whereIn('tag_id', $tags);
    }, '>=', count($tags))->paginate();
    

    【讨论】:

    • 很高兴为您提供帮助!不要忘记接受答案;)
    猜你喜欢
    • 2018-11-02
    • 2015-05-29
    • 2020-12-15
    • 1970-01-01
    • 1970-01-01
    • 2019-01-04
    • 2019-02-07
    • 2017-11-03
    • 1970-01-01
    相关资源
    最近更新 更多