Как избежать создания внешнего ключа при миграции Doctrine (двунаправленный, с наследованием одной таблицы)? - PullRequest
0 голосов
/ 01 марта 2020

получил одну проблему с Doctrine. Вот двунаправленная ассоциация ManyToOne-OneToMany

class InternetPlan extends BaseProduct
...
    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\PricingType", inversedBy="internetPlans")
     * @ORM\JoinColumn(name="pricing_type_id", referencedColumnName="id", nullable=true)
     * @JMS\Exclude()
     */
    private $pricingType;

Родительский класс

/**
 * @ORM\Entity(repositoryClass="App\Repository\ProductsRepository")
 * @ORM\InheritanceType(value="SINGLE_TABLE")
 * @ORM\DiscriminatorColumn(name="type", type="string")
 * @ORM\DiscriminatorMap(
 *     {
 *     InternetPlan::type = "InternetPlan",
 *     TVPlan::type = "TVPlan",
 *     AdditionalServicePlan::type = "AdditionalServicePlan",
 *     Device::type = "Device"
 *     }
 *    )
 */
abstract class BaseProduct

И обратная сторона

class PricingType
...
    /**
     * @ORM\OneToMany(targetEntity="App\Entity\InternetPlan", mappedBy="pricingType")
     * @ORM\JoinColumn(nullable=true, onDelete="SET NULL")
     * @JMS\Type("object_ids")
     */
    private $internetPlans;

ПРОБЛЕМА : когда я выполняю doctrine: migrations: diff , он хочет создать ограничение внешнего ключа в базовом продукте родительской таблицы, игнорируя мою аннотацию JoinColumn (nullable = true).

$this->addSql('ALTER TABLE base_product ADD CONSTRAINT FK_E74CBDC94B70279 FOREIGN KEY (pricing_type_id) REFERENCES pricing_type (id)');

Но, конечно, когда я выполняю миграцию, получаю следующую ошибку

 An exception occurred while executing 'ALTER TABLE base_product ADD CONSTRAINT FK_E74CBDC94B70279 FOREIGN KEY (pricing_type_id) REFERENCES pricing_type (id)':                                                                                      

  SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`taskman42`.`#sql-1_20`, CONSTRAINT `FK_E74CBDC94B70279` FOREIGN KEY (`pricing_type_id`) REFERENCES `pricing_type` (`id`)) 

Поэтому мне нужно вручную удалять эту строку из каждой новой миграции.

Основная вопрос : как я могу избежать этой строки в каждой новой миграции?

1 Ответ

0 голосов
/ 02 марта 2020

Jakumi был прав, основная причина, по которой я забыл сначала поставить JoinColumn (nullable = true) ... И после этого я создал объект, который был подклассом BaseProduct, так что у объекта есть priceing_type_id = 0 - вот почему ограничение внешнего ключа было таким уродливым.

UPDATE base_product SET pricing_type_id=NULL WHERE pricing_type_id=0

Это SQL было полезно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...