Есть ли сокращенный способ сохранить новую запись базы данных в Yii2 ActiveRecord?

Есть ли сокращенный способ сохранить новую запись при использовании Yii2 ActiveRecord?

Вот несколько примеров из документации:

$customer = new Customer();
$customer->name = 'Qiang';
$customer->save();

и...

Yii::$app->db->createCommand()->insert('customer', ['name' => 'Sam'])->execute();

Было бы здорово, если бы существовал сокращенный метод, например...

Customer::create(['name' => 'Qiang']);

... но я не могу найти это в документах. Интересно, если я что-то пропустил. Или мне нужно будет создать свой собственный класс ActiveRecord?


person Simon East    schedule 27.07.2018    source источник


Ответы (2)


Какой-то уродливый способ делать вещи

(new Customer(['name' => 'Qiang',]))->save();

Если вам нужно вернуть модель

($customer = new Customer(['name' => 'Qiang',]))->save();

«.. Или мне нужно создать свой собственный класс ActiveRecord?»

Будет хорошим решением для вашего случая, однако каждый раз, когда вы генерируете модель из Gii, вам нужно не забывать менять родительский класс

person Yerke    schedule 27.07.2018
comment
Или вы можете настроить шаблон Gii;) - person Yupik; 27.07.2018
comment
@Yupik да, тоже хотел об этом написать =) - person Yerke; 27.07.2018
comment
Ах здорово! Да хоть немного короче. Спасибо за быстрый ответ и советы по управлению этим с Gii. ???? - person Simon East; 27.07.2018

Создание записи на самом деле сложнее в реальном мире, потому что save() не гарантирует, что запись была сохранена в базе данных. Например валидация может не пройти, запись не сохранится и save() вернет false. В зависимости от ситуации вы можете захотеть создать исключение в этом случае или нет.

Я предлагаю создать фабричный класс и инкапсулировать в него все необходимые условия, обработку исключений или значения по умолчанию - в долгосрочной перспективе его будет легче поддерживать.

$customer = Yii::$app->modelFactory->createCustomer(['name' => 'Qiang']);
person rob006    schedule 27.07.2018