我有许多广告实体( 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
如果有人就这类问题有一个很好的链接/文章,我很乐意拥有它。
感谢。
答案 0 :(得分:1)
是的,您可以将接口设置为目标实体,described in the Symfony documentation。
这个过程基本上是:
Minn\AdsBundle\Favorite\FavoriteAwareInterface
),class MotorsFavorite implements FavoriteAwareInterface
) - 是的,它也可以从映射的超类派生,doctrine.orm.resolve_target_entities
config参数使用您的实现。有关详细信息和代码示例,请参阅文档。