Doctrine 2,用外键插入表中的错误

时间:2013-11-17 11:27:00

标签: php mysql doctrine-orm

我是使用Doctrine的新手,是我使用它的第一个项目,当我尝试插入新用户时我遇到了错误。

事情是我有一个类具有外键国家的用户,当我尝试插入用户时,也尝试插入国家,该国家已经存在,因此PDO启动了完整性约束违反和Doctrine a Doctrine \ DBAL \ DBALException。

我知道注释cascade = {“persist”}使得国家实体被写入db,没有它,doctrine启动另一个错误:

A new entity was found through the relationship 'User#country' that was not configured to cascade persist operations for entity: Country@0000000078b1861f00007f935266d9fe. To solve this issue: Either explicitly call EntityManager#persist() on this unknown entity or configure cascade persist  this association in the mapping for example @ManyToOne(..,cascade={"persist"}). If you cannot find out which entity causes the problem implement 'Country#__toString()' to get a clue.

我尝试过所有级联选项,只有持续存在且上面的所有错误都没有出现......

是否存在类似cascade = {“no-persist”}的内容或者告诉doctrine必须已经在表country中插入此属性的值???

一些代码:

/**
 * User
 *
 * @Table(name="user")
 * @Entity
 */
class User {
       ...
        /**
         * @var Country
         *
         * @OneToOne(targetEntity="Country", cascade={"persist"})
         * @JoinColumn(name="country", referencedColumnName="id")
         */
       private $country
       ...
    }
    /**
     * Country
     *
     * @Table(name="country")
     * @Entity
     */
        class Country {
           ...
            /**
             * @var integer
             *
             * @Column(name="id", type="integer")
             * @Id
             */
            private $id;

        }

任何线索都将受到高度赞赏。 感谢。

1 个答案:

答案 0 :(得分:1)

将cascade = persist放回去。

您需要检查数据库以查看该国家/地区是否存在。您对现有国家/地区的插入失败,因为国家/地区对象需要由实体经理管理。

$country = $countryRepository->find($countryId);
if (!$country) 
{
    $country = new Country();
    $entityManager->persist($country);
}
$user->setCountry($country);