Обновление / вставка связанных данных таблицы в CakePHP 3 - PullRequest
0 голосов
/ 01 сентября 2018

Я очень новичок в CakePHP 3. Я хочу обновить / вставить данные таблицы отношений. У меня есть Articles в качестве главной таблицы s, а Comments - связанная таблица, в которой article_id хранится как внешний ключ.

Кроме того, поскольку я не хочу дублировать комментарий для Article, я настроил уникальный ключ comment_id_body В Comments таблице.

Вот как я определил отношения.

class ArticlesTable extends Table
{
    public function initialize(array $config)
    {
        $this->hasMany('Comments');
    }
}

class CommentsTable extends Table
{
    public function initialize(array $config)
    {
        $this->belongsTo('Articles');
    }
}

Вот мой код.

$articlesTable = TableRegistry::get('Articles');
$article = $articlesTable->get(12);

$article->title = 'CakePHP is THE best PHP framework!';

$firstComment = $articlesTable->Comments->newEntity();
$firstComment->body = 'The CakePHP features are outstanding';

$article->comments = [$firstComment];

$articlesTable->save($article);

Проблема с этим кодом заключается в том, что он всегда пытается вставить новую строку в таблицу Comments вместо обновления существующей. Поэтому, когда я выполняю код, он выдает ошибку, как показано ниже.

Нарушение ограничения целостности: 1062 Повторяющаяся запись

Я думаю, что приведенная выше ошибка связана с дублированием записи в таблице, так как приведенный выше код пытается вставить новую запись все время, пока в таблице Comments есть запись с такими же данными.

Я хочу обновить Comments запись таблицы, и если в таблице Comments запись не найдена, она автоматически вставит новую запись при сохранении данных, вызвав метод $articlesTable->save($article);.

1 Ответ

0 голосов
/ 02 сентября 2018

Вы говорите, 'Comments - связанная таблица, в которой ArticleID хранится как внешний ключ'

Но в вашем CommentsTable классе у вас есть:

$this->belongsToMany('Articles');   // Means a Comment can belong to MULTIPLE Articles

Во-первых, предполагая, что Статьи могут иметь много Комментариев, но отдельный Комментарий относится только к одной Статье [обычному шаблону], вы должны изменить свой класс CommentsTable так, чтобы вышеприведенная строка стала:

$this->belongsTo('Articles');  // now a Comment only belongs to ONE Article

Во-вторых, формат вашего внешнего ключа не соответствует соглашениям CakePhp, поэтому измените имя поля articleID на article_id - или обратитесь к документации, чтобы узнать, как добавить параметры в belongsTo(), чтобы использовать не обычный внешний ключ.

Если вы все еще получаете ошибку «Duplicate entry», возможно, проблема с таблицей комментариев в базе данных. (Вы сделали поле тела уникальным?)

...