Красноречивые отношения и класс с конструктором - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть два класса, которые связаны через метод hasMany и serveTo.

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 передано в /Users/SouL-MAC/Code/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 голосов
/ 12 сентября 2018

$ names = $ query_parameter-> translations;

При выполнении вышеприведенного кода он фактически создает новый объект класса 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();
0 голосов
/ 12 сентября 2018

Поскольку вы расширяете данный объект, у которого уже есть конструктор, вам необходимо вызвать его с соответствующими атрибутами. См. API для Подсветка \ База данных \ Eloquent \ Model

Попробуйте что-то вроде этого:

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;
}
...