symfony2和doctrine2

时间:2015-10-05 09:36:01

标签: symfony doctrine-orm

我有许多广告实体( MotorAds RealestateAds ElectronicsAds ,...),它们共享一些属性,如标题和说明。为了避免为每个Ads实体重新定义这些属性,可以使用映射的超类方法,如下所示:

<?php
/** @MappedSuperclass */
class MappedSuperclassAds{
    /**
     * @var string
     *
     * @ORM\Column(name="title", type="string", length=255, nullable=false)
     */
    private $title;

    /**
     * @var string
     *
     * @ORM\Column(name="description", type="text", nullable=false)
     */
    private $description;
}

然后,继承将完成这项工作。

现在,问题是什么?问题是每个广告实体都与其实体相关,该实体定义了将广告添加到其收藏夹的用户列表。要做到这一点(例如 MotorsAds 实体)

1.通过该代码将 MotorsAds 实体链接到其 MotorsFavorite 实体:

/**
* @ORM\OneToMany(targetEntity="Minn\AdsBundle\Entity\MotorsFavorite",
*                mappedBy="motors",cascade={"persist", "remove"})
* @ORM\JoinColumn(nullable=true)
*/
private $favorites;

2.定义 MotorsFavorite 实体作为研究员:

<?php

namespace Minn\AdsBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * MotorsFavorite
 *
 * @ORM\Table(
 * uniqueConstraints={@ORM\UniqueConstraint(name="unique_fav_motors",
 *  columns={"user_id", "motors_id"})})
 * @ORM\Entity(repositoryClass="Minn\AdsBundle\Entity\MotorsFavoriteRepository")
 * @ORM\HasLifecycleCallbacks()
 */
class MotorsFavorite {

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

    /**
     * @ORM\ManyToOne(targetEntity="Minn\UserBundle\Entity\User")
     * @ORM\JoinColumn(nullable=false)
     */
    private $user;

    /**
     * @ORM\ManyToOne(targetEntity="Minn\AdsBundle\Entity\MotorsAds", inversedBy="favorites")
     * @ORM\JoinColumn(nullable=false, onDelete="CASCADE")
     */
    private $motors;
//...
}

正如您所看到的, MotorAds MotorFavorite 之间的关联是一种硬链接,这意味着我必须为我创建的每个广告实体创建一个收藏夹实体( FavoriteMotors FavoriteRealestate FavoriteElectronics ,...)。这是一项漫长而重复的工作。

所以我的问题是:

1.创建名为 SuperMappedFavorite 的超级映射类,包含 $ id $ user 属性将减少重复性工作。但是什么属性$ motors?如您所见,$ motors几乎与实体MotorsAds无关: @ORM \ ManyToOne(targetEntity =&#34; Minn \ AdsBundle \ Entity \ MotorsAds&#34;,inversedBy =&#34;收藏夹&#34;) 即可。这项工作的所有负担都在电动机的制定者和吸气剂中。

2.是否可以使目标实体成为这样的界面:

<?php
// SuperMappedFavorite.php
// ...
@ORM\ManyToOne(targetEntity="Minn\AdsBundle\Favorite\FavoriteAwareInterface", inversedBy="favorites")
private $object;
// ...

并且MotorsAds实体将在此实施 FavoriteAwareInterface

如果有人就这类问题有一个很好的链接/文章,我很乐意拥有它。

感谢。

1 个答案:

答案 0 :(得分:1)

是的,您可以将接口设置为目标实体,described in the Symfony documentation

这个过程基本上是:

  • 定义界面(您的Minn\AdsBundle\Favorite\FavoriteAwareInterface),
  • 在父实体中设置界面(正如您已经做过的那样),
  • 在不同的实体中实现接口(将是class MotorsFavorite implements FavoriteAwareInterface) - 是的,它也可以从映射的超类派生,
  • 然后告诉Doctrine通过doctrine.orm.resolve_target_entities config参数使用您的实现。

有关详细信息和代码示例,请参阅文档。