首页 文章

与belongsTo的Eloquent Custom Pivot问题

提问于
浏览
1

我对Eloquent和L4.2有疑问

我正在尝试在下面设置自定义Pivot模型:

//campaign model 

public function users(){
   return $this->belongsToMany('User');
}


public function newPivot(Eloquent $parent, array $attributes, $table, $exists){
    if ($parent instanceof User) {
        return new CampaignUser($parent, $attributes, $table, $exists);
    }

    return parent::newPivot($parent, $attributes, $table, $exists);
}

//user model

public function campaigns(){
   return $this->belongsToMany('Campaign');
}


public function newPivot(Eloquent $parent, array $attributes, $table, $exists){
    if ($parent instanceof Campaign) {
        return new CampaignUser($parent, $attributes, $table, $exists);
    }

    return parent::newPivot($parent, $attributes, $table, $exists);
}

在我的自定义枢轴模型“CampaignUser”下面

public function campaign() {
    return $this->belongsTo('Campaign');
}

public function User() {
    return $this->belongsTo('User');
}

public function facture() {
    return $this->belongsTo('Facture');
}

Facture模型有类似于hasMany('CampaignUser')的方法,名为campaign_user .

我正在尝试做类似的事情:

> $facture->campagne_user

但我得到以下错误:

参数1传递给Illuminate \ Database \ Eloquent \ Relations \ Pivot :: __ construct()必须是Illuminate \ Database \ Eloquent \ Model的实例,没有给出,在laravel / vendor / laravel / framework / src / Illuminate / Database中调用/Eloquent/Model.php在第849行并定义

以前有人遇到过这个问题吗?我该如何解决?

提前致谢 .

1 回答

  • 0

    通过尝试实现类似的东西我得到了同样的错误 . 实际上你不能使用pivot作为另一种关系,虽然它继承自 Model ,但我们能做的是使用traits来共享真实 Model 和自定义 Pivot 之间的代码 .

    在您的示例中,您可以将 CampaignUser pivot中定义的方法放在特征中:

    trait CampaignUserTrait {
    
        public function campaign() {
            return $this->belongsTo('Campaign');
        }
    
        public function User() {
            return $this->belongsTo('User');
        }
    
        public function facture() {
            return $this->belongsTo('Facture');
        }
    }
    

    然后定义一个继承自模型的 CampaignUser ,并应用特征:

    class CampaignUser extends Model {
        use CampaignUserTrait
    }
    

    接下来,您对自定义pivot类执行相同操作:

    class CampaignUserPivot extends Pivot {
        use CampaignUserTrait
    }
    

    最后在你的 Facture 类中,只需创建与 CampaignUser 的关系,它扩展 Model

    class Facture extends Model {
    
        public function campaign_user() {
            return $this->hasMany('CampaignUser');
        }
    }
    

    newPivot 方法现在引用了新类:

    public function newPivot(Model $parent, array $attributes, $table, $exists){
        if ($parent instanceof Campaign) {
            return new CampaignUserPivot($parent, $attributes, $table, $exists);
        }
    
        return parent::newPivot($parent, $attributes, $table, $exists);
    }
    

    基本上,pivot和模型共享的任何代码都应该在 trait 中 .

    我对Laravel和PHP一般都是新手,因此,我不会责怪任何人认为这是一个坏主意,或者是否存在更优雅的解决方案 . 此外,我没有发现任何缺点,但可能有 .

    问候

相关问题