与构造函数的雄辩关系和阶级

时间:2018-09-12 09:07:34

标签: php laravel relationship laravel-5.5 has-many

我有两个通过hasMany和belongsTo方法连接的类。

class InquiryParameter extends Model
{
    public function translations()
    {
        return $this->hasMany(InquiryParameterTranslation::class);
    }
}

class InquiryParameterTranslation extends Model
{
    public function __construct($inquiry_parameter_id, $language_code, $name, $description)
    {
            $this->inquiry_parameter_id = $inquiry_parameter_id;
            $this->language_code = $language_code;
            $this->name = $name;
            $this->description = $description;
    }
}

但是,当我创建新对象时

$inquiry_parameter = new InquiryParameter;

然后调用方法翻译。

$names = $inquiry_parameter->translations;

我收到错误:

  

类型错误:函数参数太少   App \ InquiryParameterTranslation :: __ construct(),传入0   /用户/ SouL-MAC /代码/konfig/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasRelationships.php   在653行上,正好是4个(查看:   /Users/SouL-MAC/Code/konfig/resources/views/admin/inquiry/parameters.blade.php)

是否可以对包含构造函数的类使用雄辩的关系?还是我做错了什么?

感谢您的回复

2 个答案:

答案 0 :(得分:0)

由于要扩展已具有构造函数的给定对象,因此需要使用相应的属性对其进行调用。 请参见Illuminate\Database\Eloquent\Model

的API

尝试这样的事情:

public function __construct(array $attributes = array())
{
        parent::__construct($attributes);
}

在您的特定情况下,以下方法将起作用:

public function __construct($inquiry_parameter_id, $language_code, $name, $description)
{
        parent::__construct();

        $this->inquiry_parameter_id = $inquiry_parameter_id;
        $this->language_code = $language_code;
        $this->name = $name;
        $this->description = $description;
}

答案 1 :(得分:0)

$ names = $ inquiry_parameter->翻译;

运行上述代码时,它实际上创建了一个类InquiryParameterTranslation的新对象,而没有将任何参数传递给构造函数。但是您的构造函数需要参数。因此,它会导致错误。

此问题的解决方案是您按如下所示更改构造函数代码:

public function __construct()
{
    // no parameter in constructor
}

然后创建另一个函数(如下所示)以初始化模型属性

public function initialize($inquiry_parameter_id, $language_code, $name, $description)
{
        $this->inquiry_parameter_id = $inquiry_parameter_id;
        $this->language_code = $language_code;
        $this->name = $name;
        $this->description = $description;
}

通过进行上述更改,您的代码将可以正常运行,并且当您需要向数据库中添加新翻译时,可以使用以下代码(示例)

$translation = new InquiryParameterTranslation;
$translation->initialize($inquiry_parameter_id, $language_code, $name, $description);

$translation->save();