2017-01-21 6 views
0

[Проблема решена]Symfony3 Doctrine2 Колонка не может быть пустым

Эй люди, мне нужна ваша помощь по проекту фреймворка.

У меня есть два объекта, «статья» и «изображение», статья может содержать несколько изображений, поэтому я сделал отношения OneToMany со стороны статьи и ManyToOne со стороны изображения. Doctrine генерирует для меня столбец «article_id» в таблице изображений. Я сделал форму, чтобы создать статью с одним или несколькими изображениями ... Однако, когда я исполню ее у меня есть ошибка, выброшенная:

Исключение при выполнении «INSERT INTO изображения (URL, альт, article_id) VALUES (?,?,?) 'с параметрами ["jpeg", "untitled.jpg", null]: SQLSTATE [23000]: Нарушение ограничения целостности: 1048 Столбец' article_id 'не может быть нулевым.

Когда я смотрю на журналы отладки профилировщика, я вижу, что у меня есть «INSERT INTO статье [...]» (так в статье создается с ID?) И только после этого у меня есть известный «INSERT INTO image [...]», где происходит ошибка.

Благодарим за помощь.

EDIT Жирным шрифтом вы найдете строки, которые я добавил для решения этой проблемы.

Я добавил в форму СтатьяВида статьи, в опциях коллекции изображений это:

«by_reference» => ложных

И я добавил к методе addImage в статье сущность этого:

$ image-> setArticle ($ this);

$ this-> images-> add ($ image);

+0

Ах да. Подход дробовика. Вы переходите от кода к публикации всего. И все же решение, которое я опубликовал вчера, не показано. Очень грустный. Вот мысль. Сделайте себе две новые сущности с только тем соотношением, которое имеет статья/изображение. Избавьтесь от остальной бессмыслицы, которая просто вызывает путаницу. Получите две новые сущности, чтобы правильно размещать сообщения, и вы можете понять, что происходит. – Cerad

+0

Еще лучше, следуйте примеру в документации: http://symfony.com/doc/current/form/form_collections.html – Cerad

+0

Спасибо @Cerad. Документация привела меня к решению проблемы. Я добавил строку, которую вы сказали мне в своем первом ответе: $ image-> setArticle ($ this), и я добавил также тот же метод $ this-> images-> add ($ image). Я также добавил к моим вариантам коллекции изображений «by_reference» => false. Учить уроки ! RTFM! –

ответ

0

Это очень распространенный вопрос, но на удивление трудно найти. Фактически первые десять или около того результатов поиска имели неверные ответы.

В любом случае, вам необходимо убедиться, что изображение связано с изделием.

class Article 
    public function addImage($image) { 
     $this->images[] = $image; 
     $image->setArticle($this); // ADD THIS 
+0

Спасибо, Cerad. Однако я добавил строку $ image-> setArticle ($ this), но я получил ту же ошибку ... –

+0

Должен ли я делать то же самое в объекте Image? –

+1

Подумайте, что произойдет, если вы добавите линию или попробуете ее. Убедитесь, что вы удалили свою базу данных, так как существующие изображения теперь недействительны. Убедитесь, что вызывается статья :: addImage. Вы не указали никаких подробностей о своих сущностях или форме, поэтому я полагаюсь прежде всего на свои психические способности, чтобы отладить это. – Cerad

0

Я думаю, @ ответ Cerad является очень неправильно, хотя я не могу его винить, потому что ОП не добавлял достаточно коды, не стесняйтесь с ним, мы здесь, чтобы помочь. Это также помогает кратко упомянуть, если вы только начинаете (как я подозреваю, вы есть), поскольку это поможет нам оценить, является ли его проблема новичком или чем-то глубже.

Поскольку я предполагаю, что проблема с новичком здесь - это новичок.

С помощью того способа, которым вы были сопоставлены (что я считаю правильным), вы в основном говорите Доктрине, чтобы рассказать своей РСУБД (MySql/MariaDB/PostgreSQL), что статья МОЖЕТ иметь много изображений, но изображение ДОЛЖНО принадлежать статье ,

Это означает, что если вы попытаетесь сохранить изображение без указания прав собственности, оно выдает ошибку.

Это то, что я думаю, что вы делаете очевидны в линии

(URL, альт, article_id) VALUES (?,?,?) «С Params [ "JPEG", "untitled.jpg" , null]

Значение «null» - это то, о чем проблема возникает, потому что вы не указали статью о владельце.

У вас есть 2 варианта

1.) При сохранении изображения, если у вас есть объект статьи под рукой просто сделать

$image->setArticle($article); 

2.) При сохранении изображения, если у Вас есть article_id на рука просто сделайте

$image->setArticle($em->getReference('AppBundle\Entity\Articles', $article_id)); 

При сохранении изображения вы должны следовать одному из приведенных выше.

Мой общий опыт был в том, что Doctrine действительно хорошо справляется с созданием сущностей из командной строки, что вам действительно не нужно сильно изменять, если не добавить некоторые расширенные функции, такие как тип_почты second_level_cache или MySQL.

Cheers.

+0

Хотя вы правы в том, что основная проблема заключается в том, что изображение не связано с этой статьей, я подозреваю, что после того, как вы немного поработали над ORM Doctrine 2, вы поймете, что предлагаемые обходные пути на самом деле не все так удобно и не нужны. Особенно при использовании компонента коллекции форм Symfony. – Cerad

+0

Думаю, мы разрешим ОП решить, когда он вернется к нам. Когда я говорю, что ваш ответ неправильный, я имею в виду в контексте вопроса, который, как я признаю, не является вашей ошибкой, если мои предположения верны. Если это не так, я рад признать это и не защищать его. Неправильно просить ОР редактировать объекты, если проблема (предположительно) заключается в том, как он сохраняет записи в БД. Хуже, когда вы добавляете в микс. –

+0

Просто добавьте, чтобы вы не думали, что я несправедлив, я также думал, что OP для пустого БД - это ужасная идея, потому что, исправьте меня, если я ошибаюсь, «исключение произошло во время выполнения» означает, что ничего не было спасено DB, если OP не сохранил в нескольких флешах, так зачем очищать БД? –

0

Проблема заключается в том, что при отправке формы первое изображение прикрепляется к статье, а другие нет, поэтому вы получаете ошибку SQL. Вы должны сделать «цикл foreach» для каждого изображения и прикрепить статью к каждому. Посмотрите на функцию addAction https://github.com/ismail1432/TheGoodLoc/blob/master/Symfony/src/VTC/AnnonceBundle/Controller/AdvertController.php

+0

Коллекция форм вызовет addImage для каждый новый изображение. Плакат подтвердил это вчера. Абсолютно никакой необходимости в каких-либо дополнительных циклах. – Cerad

Смежные вопросы