Связанная таблица: через link() работает только первая связь

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

Связанная таблица: через link() работает только первая связь

Сообщение azz »

Пытаюсь сохранить связанную модель:

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

$modelSites = Sites::findOne(1);
...
			if ($modelMovies->save()) {
				$modelMoviesReleases = new MoviesReleases();
				
				$modelMoviesReleases->link('movies', $modelMovies);
				$modelMoviesReleases->link('sites', $modelSites);
				
//				$modelMoviesReleases->movies_id = $modelMovies->id;
//				$modelMoviesReleases->sites_id = $modelSites->id;

				$modelMoviesReleases->save();
			}
и получаю

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

Exception 'yii\db\IntegrityException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`movies`.`movies_re
leases`, CONSTRAINT `fk-movies-releases-sites-id` FOREIGN KEY (`sites_id`) REFERENCES `sites` (`id`) ON DELETE CASCADE ON UPDATE CASCADE)
The SQL being executed was: INSERT INTO `movies_releases` (`release_date`, `movies_id`) VALUES ('Release Date: 20 January 2019', 1)'

in C:\webservers\home\movies.local\vendor\yiisoft\yii2\db\Schema.php:664

Error Info:
Array
(
    [0] => 23000
    [1] => 1452
    [2] => Cannot add or update a child row: a foreign key constraint fails (`movies`.`movies_releases`, CONSTRAINT `fk-movies-releases-sites-id` FOREIGN KEY (`sites_id`) REFERENCES `sites` (
`id`) ON DELETE CASCADE ON UPDATE CASCADE)
)
но если присвоить полям movies_id и sites_id значения напрямую (закомментировано), то всё работает. Не пойму, почему через link() добавляется только первая связь? Все отношения в моделях прописаны. Если поменять местами строки

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

				$modelMoviesReleases->link('sites', $modelSites);
				$modelMoviesReleases->link('movies', $modelMovies);
то будет ругаться уже на отсутствие поля movies_id
someweb
Сообщения: 552
Зарегистрирован: 2017.03.09, 10:12

Re: Связанная таблица: через link() работает только первая связь

Сообщение someweb »

Потому что использование link() в вашем случае эквивалентно

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

$modelMoviesReleases->movies_id = $modelMovies->id;
$modelMoviesReleases->save();
$modelMoviesReleases->sites_id = $modelSites->id;
$modelMoviesReleases->save();
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.
azz
Сообщения: 197
Зарегистрирован: 2016.07.06, 17:20

Re: Связанная таблица: через link() работает только первая связь

Сообщение azz »

someweb писал(а): 2019.01.18, 16:48 Потому что использование link() в вашем случае эквивалентно

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

$modelMoviesReleases->movies_id = $modelMovies->id;
$modelMoviesReleases->save();
$modelMoviesReleases->sites_id = $modelSites->id;
$modelMoviesReleases->save();
т.е. link() делает и save()?
someweb
Сообщения: 552
Зарегистрирован: 2017.03.09, 10:12

Re: Связанная таблица: через link() работает только первая связь

Сообщение someweb »

Да.
Метод link() требует указать название связи и целевой объект Active Record, с которым должна быть установлена связь. Метод изменит значения атрибутов, которые связывают два объекта Active Record, и сохранит их в базу данных.
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.
Ответить