与belongsTo的Eloquent Custom Pivot问题

时间:2015-12-11 14:49:20

标签: php laravel laravel-4 eloquent pivot-table

我对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 /供应商/ laravel /框架/ SRC /照亮/数据库/锋/ Model.php   在第849行并定义

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

提前致谢。

1 个答案:

答案 0 :(得分:0)

通过尝试实现类似的功能,我得到了同样的错误。 实际上,您不能将pivot作为另一种关系使用,尽管它继承自Model,但我们可以做的是使用traits来共享 real {{1}之间的代码}和自定义Model

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

CampaignUser

然后定义一个继承自模型的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
}

最后在您的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); }

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

问候