Правильное связывание через link

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Brainfuck
Сообщения: 313
Зарегистрирован: 2018.02.19, 14:20

Правильное связывание через link

Сообщение Brainfuck »

Есть модель Account(id, person_id) и связанная с ней Person(id) отношением:

Код: Выделить всё

public function getPerson() { // в модели Account
	return $this->hasOne(Person::class, ['id' => 'person_id']);
}
Проблема в том что когда я пытаюсь сделать вот так:

Код: Выделить всё

public function beforeSave($insert) { // в модели Account
	if ($insert)
		$this->link('person', new Person);

	return parent::beforeSave($insert);
}
падает ошибка "Unable to link models: the primary key of app\models\Person is null". Подскажите как сделать правильно? Не, ну понятно что можно вручную сделать:

Код: Выделить всё

if ($insert) {
	$person = new Person;
	$person->save();
	$this->link('person', $person);
}
Но тогда можно было и вообщем этим методом link не пользоваться... Я думал он сам ее сохранит, а он походу не умеет?
Brainfuck
Сообщения: 313
Зарегистрирован: 2018.02.19, 14:20

Re: Правильное связывание через link

Сообщение Brainfuck »

Все даже еще хуже чем я думал. Если я пытаюсь сделать сохранение Person вручную то у меня все уходит в бесконечную рекурсию, т.к. link в свою очередь запускает сохранение Account (а ведь я в этот момент уже нахожусь в методе beforeSave). Это какая-то жесть... Зачем этот бестолковый метод если он нефига не умеет? На первый взгляд удобно, а по факту - хрень какая-то выходит.
german.igortcev
Сообщения: 251
Зарегистрирован: 2014.08.18, 14:01

Re: Правильное связывание через link

Сообщение german.igortcev »

Использование beforeSave не очень решение. связанно с тем , что попасть в рекурсию там очень легко из за простой логической ошибки. Убирайте, делайте линк в контроллере перед методом save
Brainfuck
Сообщения: 313
Зарегистрирован: 2018.02.19, 14:20

Re: Правильное связывание через link

Сообщение Brainfuck »

german.igortcev писал(а): 2019.03.01, 18:21 Использование beforeSave не очень решение. связанно с тем , что попасть в рекурсию там очень легко из за простой логической ошибки. Убирайте, делайте линк в контроллере перед методом save
Нет уж. Проще не использовать link, а по старинке присваивать id
Ответить