@Bohdan_Vasilchuk

Как с помошью ActiveRecord в Yii2 вносить данные, содержашие внешний ключ?

В БД есть таблица galleries (ownerId (PK), object_id(FK))

Вот модель:
<?php

namespace app\models;

use Yii;
use yii\base\Model;
use yii\db\ActiveRecord;

class Product extends ActiveRecord
{
    public $ownerId;
    public $object_id;
    private $connection;
    
    public function __construct()
    {
        $this->connection = Yii::$app->db;   
    }
    
    public static function tableName(){
        return 'galleries';
    }
    
    public static function primaryKey()
    {
        return 'ownerId';
    } 
}


Вот так я в контроллере вношу данные (в данном примере для теста - они константные):
public function actionProduct()
    {
        $model = new Product();
        $model->object_id = 1;
        $model->save();
        return $this->render('product', ['model' => $model]);
    }


Таким образом, я ожидаю, что выполнится примерно такой запрос:
INSERT INTO `galleries` (`object_id`) VALUES (1);
То есть, ownerId не указываем из-за того, что автоинкремент, а задаем значение для object_id. При этом, в таблице, на которую ссылается этот ключ значение 1 уже существует на момент выполнения запроса.

Что я получаю:
SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`my_db.`galleries`, CONSTRAINT `galleries_ibfk_1` FOREIGN KEY (`object_id`) REFERENCES `objects` (`object_id`) ON DELETE CASCADE ON UPDATE CASCADE)
The SQL being executed was: <b>INSERT INTO `galleries` (`ownerId`) VALUES (DEFAULT)</b>


Вопросы:
1) Почему пытается выполниться именно такой запрос?
2) Как все-таки внести эти данные? Неужели, для этого нужно делать ещё одну модель для таблицы, на которую ссылаемся и прописывать в коде текущей модели для них связи?

Спасибо!
  • Вопрос задан
  • 1104 просмотра
Пригласить эксперта
Ответы на вопрос 2
mitaichik
@mitaichik
Это происходит из-за того, что вы объявили аттрибуты как свойства класса ( public $object_id;) - убери это, в Yii доступ к аттрибутам осуществляется через магические методы.

А вообще, лично я, чтоб связать релейшены, юзаю метод ActiveRecord::link - очень удобный метод, советуб обратить на него внимание.
Ответ написан
Комментировать
bitver
@bitver
Я могу ошибаться, но вы ошибку показываете не из приведенного в вопросе action.
INSERT INTO `galleries` (`ownerId`) VALUES (DEFAULT) - вот default смущает.
Или же вы забыли прописать rules() в модели Product. Хотя-бы safe дать атрибуту, он уже будет писаться в БД.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы