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”是一个全局地址表。我认为问题来自profileClass
joinColumns={@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!