【问题标题】:Eloquent Custom Pivot issue with belongsTo与 belongsTo 相关的 Eloquent Custom Pivot 问题
【发布时间】:2016-03-17 12:34:54
【问题描述】:

我对 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') 的方法,称为 活动用户。

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

> $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 行并定义

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

提前致谢。

【问题讨论】:

  • 你能粘贴完整的自定义数据中心 CampaignUser 定义吗?
  • 已经在我之前的帖子里了
  • UserCampaign 是一个枢轴而不是常规模型,因此您不能将其用作关系。它需要常规模型不需要的构造函数参数。
  • @lagbox 谢谢你的回答。有没有办法使用它有没有关系...?
  • 不,它不是常规型号。自定义数据透视类型替换了附加到从多对多关系返回的模型的通用数据透视类型,就是这样。

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


【解决方案1】:

我尝试实现类似的东西时遇到了同样的错误。 确实,您不能将枢轴用作另一个关系,尽管它继承自 Model,但我们可以做的是使用 traitsreal Model 和自定义 @987654324 之间共享代码@。

在您的示例中,您可以将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
}

接下来,您对自定义数据透视类执行相同操作:

class CampaignUserPivot extends Pivot {
    use CampaignUserTrait
}

最后在您的Facture 类中,只需创建与扩展ModelCampaignUser 的关系:

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 还很陌生,所以我不会责怪任何人认为这是一个坏主意,或者是否存在更优雅的解决方案。此外,我没有发现任何缺点,但可能有。

问候

【讨论】:

    猜你喜欢
    • 2015-10-16
    • 2020-02-02
    • 2018-08-06
    • 2015-12-22
    • 2020-07-03
    • 1970-01-01
    • 2019-02-15
    • 1970-01-01
    • 2019-05-12
    相关资源
    最近更新 更多