Php Doctrine2一对一关系和额外表
我有三张桌子: 用户、用户配置文件和额外表用户地址 用户类别:Php Doctrine2一对一关系和额外表,php,doctrine-orm,Php,Doctrine Orm,我有三张桌子: 用户、用户配置文件和额外表用户地址 用户类别: class User { /** * @ORM\Id() * @ORM\Column(name="user_id", type="integer") * @ORM\GeneratedValue(strategy="AUTO") * @var int */ private $userId; /*
class User
{
/**
* @ORM\Id()
* @ORM\Column(name="user_id", type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
* @var int
*/
private $userId;
/**
* @ORM\OneToOne(targetEntity="Entity\UserProfile", cascade={"persist", "remove"}, mappedBy="user", fetch="LAZY")
* @var Entity\UserProfile
*/
private $profile;
/**
* @param Entity\UserProfile $profile
*/
public function setProfile(UserProfile $profile) {
$this->profile = $profile;
$profile->setUser($this);
return $this;
}
(...)
}
用户配置文件类
class UserProfile
{
/**
* @ORM\Id()
* @ORM\Column(name="profile_id", type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
* @var int
*/
private $profileId;
/**
* @ORM\OneToOne(targetEntity="Entity\User", inversedBy="profile")
* @ORM\JoinColumn(name="user_id", referencedColumnName="user_id")
* @var Entity\User
*/
private $user;
/**
* @ORM\ManyToMany(targetEntity="Entity\Address", cascade={"persist"})
* @ORM\JoinTable(name="users_addresses",
* joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="user_id")},
* inverseJoinColumns={@ORM\JoinColumn(name="address_id", referencedColumnName="address_id")}
* )
**/
private $addresses;
/**
* @param Address $address
*/
public function addAddress(Address $address) {
if (!$this->addresses->contains($address)) {
$this->addresses->add($address);
}
return $this;
}
(...)
}
地址类
class Address
{
/**
* @ORM\Id()
* @ORM\Column(name="address_id", type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
* @var int
*/
private $addressId;
/**
* @ORM\Column(type="string", length=128, nullable=false)
* @var string
*/
private $city;
(...)
}
添加具有配置文件数据和地址的用户
$userAddress = new \Entity\Address();
$userAddress->setStreet($street);
$userAddress->setCity($city);
$userAddress->setCountry($country);
$userAddress->setState($state);
$userAddress->setZipCode($zipCode);
$userProfile = new \Entity\UserProfile();
$userProfile->addAddress($userAddress);
$user = new \Entity\User();
$user->setProfile($userProfile);
$em->persist($user);
$em->flush();
目前我遇到的问题是,实体保持正常,但联接表中的“user\u id”(“users\u addresses”)不正确(“user\u id”=0,“address\u id”=correct)。表“地址”不能包含像“用户id”这样的额外字段。我做错了什么
我需要这样的结构:
您的建模显示表
users
和users\u profile
共享相同的主键,即user\u id
,因此该列也是users\u profile
中指向users
的外键
因此,您应该将Php注释中的profile\u id
替换为user\u id
,删除键自动生成指令,并更新(或删除并重新创建)模式
class UserProfile {
/**
* @ORM\Id
* @ORM\Column(name="user_id", type="integer")
* @var int
*/
private $profileId;
/* ... */
}
然后
或者,如果已经有架构,请使用update
命令
您还可以重命名php类属性(
$profileId
),以与DB模型“保持一致”,但我认为这并不重要,除非您有依赖于特定名称的代码。请澄清这句话:“当我在附加表中添加用户时,会保存地址id和配置文件id,而不是用户id。”你能举例说明吗?你还需要一个地址类,不是吗?你能提供你用来创建用户的实际脚本吗?为什么你要建立一个用户地址多对多关系,而实际上它是一个用户配置文件到地址的关系,每个配置文件只有2个地址(所以你不需要多对多,只需要2个一对一)“Address”是一个全局地址表。我认为问题来自profileClassjoinColumns={@ORM\JoinColumn(name=“user\u id”…
$ doctrine orm:info --verbose
Found 3 mapped entities:
[OK] Address
[OK] User
[OK] UserProfile
$ doctrine orm:schema-tool:create
ATTENTION: This operation should not be executed in a production environmnent.
Creating database schema...
Database schema created successfully!