我似乎无法弄清楚我做错了什么。我正在使用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 **/
}
答案 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方法的名称