Почему join column в Doctrine присваивается null перед flush?

Есть две сущности
/**
 * @Entity
 * @Table(name="`order`")
 */
class Order
{
    public function __construct()
    {
        $this->products = new ArrayCollection();
        $this->totals = new ArrayCollection();
    }
    /**
     * @Id
     * @Column(type="integer")
     */
    protected $order_id;
    /**
     * @Id
     * @Column(type="integer")
     */
    protected $order_code;
    /**
     * @Column(type="integer")
     */
    protected $warehouse_id;
    /**
     * @OneToOne(targetEntity="\Core\Entities\Delivery\BoxberryTtn", mappedBy="ttn_boxberry", cascade={"persist", "remove"})
     * @JoinColumn(name="order_code", referencedColumnName="order_code")
     */
    protected $boxberry_ttn;
}

и
/**
 * @Entity
 * @Table(name="`ttn_boxberry`")
 */
class BoxberryTtn
{
    /**
     * @Id
     * @Column(type="integer")
     * @GeneratedValue(strategy="IDENTITY")
     */
    protected $id;
    /**
     * @Column(type="string")
     */
    protected $ttn_num;
    /**
     * @Column(type="float", scale=2)
     */
    protected $delivery_cost;
    /**
     * @Column(type="string")
     */
    protected $order_code;
}

Связь один к одному . Когда создается заказ , то связь не добавляется сразу. Проблема в том , что перед сохранением заказа и вызовом flush() у сущности Order полю order_code значение присвоено , но когда выполняется непосредственно flush() , то поле order_code обнуляется . Судя по всему проблема в определении связей , потому что если убираю @JoinColumn(name="order_code", referencedColumnName="order_code") в маппинге , то все проходит . Где я накосячил , что так странно ведет себя доктрина?
  • Вопрос задан
  • 451 просмотр
Решения вопроса 1
BoShurik
@BoShurik Куратор тега Symfony
Symfony developer
https://www.doctrine-project.org/projects/doctrine...

referencedColumnName: Name of the primary key identifier that is used for joining of this relation.


/**
 * @OneToOne(targetEntity="\Core\Entities\Delivery\BoxberryTtn", mappedBy="ttn_boxberry", cascade={"persist", "remove"})
 * @JoinColumn(name="order_code", referencedColumnName="id")
 */
protected $boxberry_ttn;


Если хочется, чтоб была связь через order_code, то сделайте его primary key:
/**
 * @Entity
 * @Table(name="`ttn_boxberry`")
 */
class BoxberryTtn
{
    /**
     * @Id
     * @Column(type="string")
     * @GeneratedValue(strategy="NONE")
     */
    protected $id;
    
    public function __construct(string $id)
    {
        $this->id = $tid;
    }
}


Плюс, у вас два поля order_code
/**
 * @Entity
 * @Table(name="`order`")
 */
class Order
{
    /**
     * @Id
     * @Column(type="integer")
     */
    protected $order_code;

    /**
     * @OneToOne(targetEntity="\Core\Entities\Delivery\BoxberryTtn", mappedBy="ttn_boxberry", cascade={"persist", "remove"})
     * @JoinColumn(name="order_code", referencedColumnName="order_code")
     */
    protected $boxberry_ttn;
}


Они так же друг другу могут перезаписывать

В идеале должно быть что-то вроде этого

/**
 * @Entity
 * @Table(name="`order`")
 */
class Order
{
    /**
     * @Id
     * @Column(type="integer")
     */
    protected $order_id;

    /**
     * @Id
     * @Column(type="integer")
     */
    protected $order_code;

    /**
     * @Column(type="integer")
     */
    protected $warehouse_id;

    /**
     * @OneToOne(targetEntity="\Core\Entities\Delivery\BoxberryTtn", cascade={"persist", "remove"})
     * @JoinColumn(referencedColumnName="order_code")
     */
    protected $boxberry_ttn;

    public function __construct(int $order_id, string $order_code)
    {
        $this->order_id = $order_id;
        $this->order_code = $order_code;
    }
}

/**
 * @Entity
 * @Table(name="`ttn_boxberry`")
 */
class BoxberryTtn
{
    /**
     * @Id
     * @Column(type="string")
     * @GeneratedValue(strategy="NONE")
     */
    protected $order_code;

    /**
     * @Column(type="string")
     */
    protected $ttn_num;

    /**
     * @Column(type="float", scale=2)
     */
    protected $delivery_cost;

    public function __construct(Order $order)
    {
        $this->order_code = $order->getOrderCode();
    }
}

Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы