Laravel 5.1 hasManyThrough Pivot表

时间:2015-09-17 16:05:53

标签: laravel-5 many-to-many pivot-table has-many-through

我有许多关系的模型。我想通过数据透视表分类新闻来关联类别

类别模型

class Category extends Model
{
    public function news() {

        return $this->belongsToMany('App\News');

    } 
}

新闻模式

class News extends Model
    {
         public function categories()
        {
            return $this->belongsToMany('App\Category');
        }
        public function state()
        {
            return $this->belongsTo('App\State');
        }
}

和州模式

class State extends Model
{
    public function news() {

        return $this->hasMany('App\News');

    }  
}

我想选择与cat_type = 2的状态相关的新闻(来自类别表) 我试过了

$slide_news = State::whereHas('news.categories',function($query){ $query->where('categories.cat_type',2);})

                    ->with(array('news'=>function($query){ 
                    $query->orderBy('created_at', 'desc');}
                   ))->where('id',$id)->first();

但是cat_type过滤器无效。我也尝试过hasManyThrough,但我不知道如何使用Pivot Table实现它 请帮忙

2 个答案:

答案 0 :(得分:1)

看看here

目前Laravel 5.3并不支持使用数据透视表的hasToManyThrogh。只需使用其他方法。

作为替代方式
只要考虑这些模型及其关系:

A <=> B with pivot table A_B
B <=> C with pivot table B_C

现在您可以创建 pivot VIEW 调用A_C:

SELECT A_id, C_id FROM A_B
INNER JOIN B_C on A_B.B_id = B_C.B_id
GROUP BY A_id, C_id

我想你可以猜到我的伎俩。
是的,忘了hasManyThough。 现在您可以使用A.belongsToMany(C)。
只是不要忘记标记为已接受的答案:))

答案 1 :(得分:0)

有一个Laravel 5.5 Composer软件包,可以执行多级关系(深层)

包装: https://pastebin.com/AHJ5UpEu

示例:

User→属于许多→Role→属于许多→Permission

class User extends Model
{
    use \Staudenmeir\EloquentHasManyDeep\HasRelationships;

    public function permissions()
    {
        return $this->hasManyDeep(
            'App\Permission',
            ['role_user', 'App\Role', 'permission_role'], // Pivot tables/models starting from the Parent, which is the User
        );
    }
}

例如需要定义外键的示例:

https://github.com/staudenmeir/eloquent-has-many-deep


致主持人: 不要删除我的答案

我花了两天的时间才解决了这个问题,我感到非常高兴,发现了我想让全世界知道的解决方案

请注意,我的答案已被批准,但您已将其删除。

问题的标题是关于:Laravel的hasManyThrough数据透视表,而我的回答恰恰是,一种在数据透视表上执行hasManyThrough等效的解决方案

这个问题已有3年历史了,让我们承认没有人想要针对这个问题的解决方案,因为我们都有自己的解决方案。 如果我是你,我希望有一个通用的答案。