【问题标题】:Symfony: ManyToMany table extra columnsSymfony:ManyToMany 表额外列
【发布时间】:2018-05-15 06:59:37
【问题描述】:

我有一个用于UserHouse 的多对多表,称为user_house。而不是只有两列:user_id 和 house_id,我想再添加 3 列:例如 action、created_at、updated_at。我该怎么做?

我找不到任何相关文档。

以下只是创建一个单独的表,其中包含两列。

class User extends EntityBase
{
    ...
    /**
     * @ORM\ManyToMany(targetEntity="AppBundle\Entity\House")
     */
    protected $action;

基本上,我想要实现的是:

user_house 表中,user_idhouse_idaction 的组合应该是唯一的。

当用户单击房屋上的“视图”时,user_house 表将更新为some user_idsome house_idviewnow()now()

当用户在房子上点击“赞”时,user_house 表会更新为some user_idsome house_idlikenow()now()

当用户在房子上单击“请求通话”时,user_house 表将更新为some user_idsome house_idcontactnow()now()

有人能指出我正确的方向吗?谢谢!

【问题讨论】:

  • 您必须创建与OneToMany 关系到UserOneToMany 关系到Houseaction 字段的第三个实体(即UserHouse)。为避免重复,请添加唯一索引(用户、房屋)。

标签: symfony doctrine-orm many-to-many


【解决方案1】:

您需要通过引入称为UserHasHouses 的连接实体来打破ManyToManyOneToManyManyToOne 的关系,这样您就可以在连接表user_house 中添加多个列

用户实体

/**
 * User
 * @ORM\Table(name="user")
 * @ORM\Entity
 */
class User
{
    /**
     * @ORM\OneToMany(targetEntity="NameSpace\YourBundle\Entity\UserHasHouses", mappedBy="users",cascade={"persist","remove"} )
     */
    protected $hasHouses;

}

房屋实体

/**
 * Group
 * @ORM\Table(name="house")
 * @ORM\Entity
 */
class House
{
    /**
     * @ORM\OneToMany(targetEntity="NameSpace\YourBundle\Entity\UserHasHouses", mappedBy="houses",cascade={"persist","remove"} )
     */
    protected $hasUsers;

}

UserHasHouses 实体

/**
 * UserHasHouses 
 * @ORM\Table(name="user_house")
 * @ORM\Entity
 */
class UserHasHouses 
{

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

    /**
     * @ORM\ManyToOne(targetEntity="NameSpace\YourBundle\Entity\House", cascade={"persist"}, fetch="LAZY")
     * @ORM\JoinColumn(name="house_id", referencedColumnName="id")
     */
    protected $houses;

    /**
     * @ORM\ManyToOne(targetEntity="NameSpace\YourBundle\Entity\User", cascade={"persist","remove"}, fetch="LAZY" )
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id",nullable=true)
     */
    protected $users;


    /**
     * @var \DateTime
     * @ORM\Column(name="created_at", type="datetime")
     */
    protected $createdAt;


    /**
     * @var \DateTime
     * @ORM\Column(name="updated_at", type="datetime")
     */
    protected $updatedAt;
     //... add other properties
    public function __construct()
    {
        $this->createdAt= new \DateTime('now');
    }

}

have additional column in ManyToMany join table in Doctrine (Symfony2)

【讨论】:

  • @Khalid 你能否让我知道如何让一组 {user_id, house_id, action} 成为主要(或唯一)。例如,它们三个不能重复,例如1,1,view,然后是另一个1,1,view,但它可以是1,2,view。非常感谢!
  • @NodirRashidov 您可以在UserHasHouses Entity 中为多个属性定义@UniqueEntity 注释,请查看UniqueEntity Annotation。在你的情况下,它就像fields={"houses", "users", "action"},
  • 我昨天尝试了这个,但我使用的是列名 ({house_id , user_id, action}),但它不起作用。我将尝试使用变量名称并在 20 分钟内回信。谢谢!
  • @NodirRashidov 是的,你必须使用属性名而不是列名
  • 我还必须将此添加到 * @ORM\Table(...) 注释中: * @ORM\Table(name="user_house",uniqueConstraints={@UniqueConstraint(name="user_house_action", columns={"user_id", "house_id", "action"})}) ,否则 mysql 表将不会生成一组主键。感谢您的帮助!
猜你喜欢
  • 2016-11-22
  • 2019-09-19
  • 1970-01-01
  • 2014-07-14
  • 1970-01-01
  • 1970-01-01
  • 2012-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多