无法持久化主义实体,外键始终为null,尽管设置它们

时间:2017-07-21 16:17:42

标签: php symfony doctrine

我似乎无法弄清楚我做错了什么。我正在使用Symfony,我创建了一个名为“UserProfile”的实体。它有一个user_id和一个account_id。我在控制器中设置它们是这样的:

$profile = new UserProfile;
$profile->setAccountId($account->getId())
    ->setUserId($user->getId());
然后我尝试像这样坚持实体:

$entityManager->persist($profile);
$entityManager->flush();

如果我转储配置文件,它会显示account_id设置为1,user_id设置为17(这正是我所期望的)。然而,当我尝试持久化实体时,我得到一个例外,即account_id和user_id不能为空。这是我的实体定义。我只能假设我的定义有问题。如果您还需要其他任何帮助我诊断我的问题,请告诉我。提前谢谢大家!

<?php

namespace Denizen\AppBundle\Entity;

use DateTime;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * UserProfile
 *
 * I have set up a unique index on account_id/user_id so that only one profile may exist per user per account.
 *
 * @ORM\Entity(repositoryClass="Denizen\AppBundle\Repository\UserProfileRepository")
 * @ORM\Table(name="users_profiles", uniqueConstraints={@ORM\UniqueConstraint(name="account_user_profile_unique", columns={"account_id", "user_id"})})
 */
class UserProfile
{

    const STATUS_NEW = 'new';

    const STATUS_COMPLETED = 'completed';

    /**
     * @var User
     * @ORM\ManyToOne(targetEntity="User", inversedBy="profiles")
     */
    protected $user;

    /**
     * @var Account
     * @ORM\ManyToOne(targetEntity="Account", inversedBy="profiles")
     */
    protected $account;

    /**
     * @var int
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @var int
     * @ORM\Column(type="integer", name="user_id", nullable=false)
     */
    protected $userId;

    /**
     * @var int
     * @ORM\Column(type="integer", name="account_id", nullable=false)
     */
    protected $accountId;

    /**
     * @var string
     * @ORM\Column(type="string", name="status", nullable=true)
     */
    protected $status;

    /** snip **/

    /**
     * UserProfile constructor.
     */
    public function __construct()
    {
        $this->setStatus(static::STATUS_NEW);
    }

    public function getUser()
    {
        return $this->user;
    }

    public function getAccount()
    {
        return $this->account;
    }

    /**
     * Get id
     *
     * @return int
     */
    public function getId(): int
    {
        return $this->id;
    }

    /**
     * @return int
     */
    public function getUserId(): int
    {
        return $this->userId;
    }

    /**
     * @param int $userId
     */
    public function setUserId(int $userId)
    {
        $this->userId = $userId;

        return $this;
    }

    /**
     * @return int
     */
    public function getAccountId(): int
    {
        return $this->accountId;
    }

    /**
     * @param int $accountId
     */
    public function setAccountId(int $accountId)
    {
        $this->accountId = $accountId;

        return $this;
    }

    /**
     * @return string
     */
    public function getStatus(): ?string
    {
        return $this->status;
    }

    /**
     * @param string $status
     * @return UserProfile
     */
    public function setStatus(?string $status)
    {
        $this->status = $status;
        return $this;
    }

    /** snip **/

}

1 个答案:

答案 0 :(得分:0)

实际上你不必定义属性$ userId和$ accountId,因为你已经定义了一个$ user和$ accounts属性,同样在你应该告诉symfony这个连接列名的定义中。 例如,如果数据库模式中的“配置文件”表具有“user_id”列,则应按如下方式映射:

   /**
     * @ORM\ManyToOne(targetEntity="User", inversedBy="profiles")
     * @ORM\JoinColumn(name="user_id", referencedColumnName="user_id")
     */
    protected $user;

假设列'user_id'的名称与表'profile'和'user'相同

然后创建UserProfile的实例

$userProfile = new UserProfile();
$userProfile->setUser($someExistingUser);
$entityManager->persist($userProfile);
$entityManager->flush();

此外,如果您想稍后检索用户ID,请按以下步骤进行操作

$userId = $userProfile->getUser()->getId();

取决于实体中getter和setter方法的名称