当前位置: 首页 > 知识库问答 >
问题:

有说服力的自定义枢轴问题与belongsTo

阮才俊
2023-03-14

我对雄辩和L4.2有意见

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

//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);
}

下面是我的自定义透视模型“活动用户”

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

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

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

制作模型有一些类似于hasMany(“活动用户”)的方法,称为campaign\u user。

我试着做一些事情,比如:

> $facture->campagne_user

但我犯了以下错误:

传递给__construct()的Argument 1必须是Illumate\Database\Eloquent\关系\Pivot::模型的一个实例,没有给出,在第849行的laravel/供应商/laravel/框架/src/Illumate/数据库/Eloquent/Model.php中调用并定义

以前有人有这个问题吗?我该怎么解决呢?

提前谢谢。

共有1个答案

利永年
2023-03-14

我通过尝试实现类似的目标而犯了同样的错误。事实上,您不能将pivot用作另一个关系,尽管它继承自模型,但我们可以使用traits在真实模型和自定义pivot之间共享代码。

在您的示例中,您可以将activityuserpivot中定义的方法放置在trait中:

trait CampaignUserTrait {

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

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

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

然后定义一个继承自模型的 然后应用trait:

class CampaignUser extends Model {
    use CampaignUserTrait
}

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

class CampaignUserPivot extends Pivot {
    use CampaignUserTrait
}

最后,在Facture类中,只需创建与扩展模型的活动用户的关系即可:

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

问候语

 类似资料:
  • 我有一个Spring启动应用程序,我正在尝试连接到DB2服务。但是我没有服务连接创建者异常,因为枢轴云代工支持Mongo db和其他一些db。有人能告诉我如何在DB2服务的Spring启动应用程序中编写自定义服务连接器吗?

  • 希望你今天过得愉快。 我用的是Laravel 8。我有三个模型,我需要这些模型“纠缠”,可以说。 所以,我有三个基本的表 null null 我最后的方法是查询保存的自定义枢轴模型,并附加模型,但我想先问一下是否有更干净、更有说服力的方法来实现这一点。 任何建议都有帮助。提前感谢您慢慢来。

  • 我在连接Laravel中的数据库模型时遇到问题。 现在,我想把它们连接起来,就像,每个用户可以有多个公司,每个公司都有自己的company_details。 我的用户。php模型如下所示: 如何从company_details表中获取值?

  • 我有一个数据库结构,其中我有一个用户和公司之间的多对多关系表。为此,我有一个交叉引用表company_user。此外,每个用户在公司中都有一定的角色,因此交叉引用表也有role_id。问题是,由于某种原因,当我试图从交叉引用表中检索角色时,我会出现异常。 以下是我如何定义公司模型中的关系: 现在,如果我只是尝试从pivot获取角色id,一切都会正常工作: 但是我还需要角色的数据,所以我在自定义透视

  • 问题内容: 示例选择: 输出: 是否可以按时间顺序对记录进行排序,排除列“月”和“年”?没有列出所有列。 UPD 需要: 就像是: 问题答案: 要对记录进行排序,可以将以下内容添加到sql的末尾 注意:枢轴列名称区分大小写,因此需要用引号引起来 这是完整的查询,仅选择您需要的列: