【问题标题】:Doctrine: extra where on relation (many-to-many)教义:额外的关系(多对多)
【发布时间】:2013-02-05 13:13:09
【问题描述】:

这是我的第一个问题,所以我希望我能尽其所能。

我有 2 个具有多对多关系的学说实体,效果很好,但我还想在多对多表上添加一个额外的检查。问题是在 DQL 中我无法找到正确的列。

我想到了两种可能性:抽象父类或原生查询。 我将粘贴下面有效的本机查询,但这不是我所希望的,因为我们必须复制和粘贴它。

所以我想做关系+类型。所以对于这个例子,我还需要检查 type = 'Gallery'

gallery_object(表格)
id、标签、已删除
1、赞助商、0

media_relations(表格)
id, mediaid, 类型, typeId
1, 37, 画廊, 1

媒体文件
ID、用户 ID、文件名、文件路径、文件大小、mime_type、日期、已删除
37, 4, 533882_10151332524797037_1940030593_n_20.jpg, /resources/upload/www/, 82724, image/jpeg, 2013-01-25 15:04:46, 0

$rsm = new ResultSetMapping;
$rsm->addEntityResult(Helper::getNamespace('Gallery', 'Models/Entities') . "Object", 'o')
    ->addFieldResult('o', 'id', 'id')
    ->addFieldResult('o', 'tag', 'tag')
    ->addFieldResult('o', 'deleted', 'deleted')
    ->addJoinedEntityResult(ltrim(Helper::getNamespace('Media', 'Models/Entities') . "Media", '\\'), 'm', 'o', 'file')
    ->addFieldResult('o', 'file', 'id')
    ->addFieldResult('m', 'mid', 'id')
    ->addFieldResult('m', 'user', 'userid')
    ->addFieldResult('m', 'filename', 'filename')
    ->addFieldResult('m', 'filepath', 'filepath')
    ->addFieldResult('m', 'filesize', 'filesize')
    ->addFieldResult('m', 'mime_type', 'mime_type')
    ->addFieldResult('m', 'date', 'date')
    ->addFieldResult('m', 'mdeleted', 'deleted');

$sql = "SELECT o.id AS oid, m.id as file, o.tag, o.deleted, m.id AS mid, m.userid, m.filename, m.filepath, m.filesize, m.mime_type, m.date, m.deleted as mdeleted
    FROM gallery_object as o
        INNER JOIN media_relations mr ON (mr.typeid = o.id AND mr.type = 'Gallery')
        INNER JOIN media_files m ON (mr.mediaid = m.id)";
$result = $this->_em->createNativeQuery($sql, $rsm)->getResult();

return $result;

实体看起来像

/**
 * Media entity
 *
 * @Entity(repositoryClass = "iTet\Application\Modules\Media\Models\Repositories\Media")
 * @Table(name="media_files")
 * @author Stephen Fenne
 */

class Media
{
/**
 * @Id
 * @Column(type="integer")
 * @GeneratedValue
 * @var int
 */
protected $id;

/**
 * @ManyToOne(targetEntity="iTet\Application\Modules\Core\User\Models\Entities\User")
 * @JoinColumn(name="userId", referencedColumnName="id")
 * @var int
 */
protected $user;

/**
 * @Column(length = 100)
 * @var string
 */
protected $filename;

/**
 * @Column
 * @var string
 */
protected $filepath;

/**
 * @Column(type = "integer")
 * @var int
 */
protected $filesize;

/**
 * @Column
 * @var string
 */
protected $mime_type;

/**
 * @Column(type = "datetime", nullable=true)
 * @var \DateTime 
 */
protected $date;

/**
 * @Column(type = "integer")
 * @var int
 */
protected $deleted = false;

--

/**
 *
 * @Entity(repositoryClass="iTet\Application\Modules\Gallery\Models\Repositories\Object")
 * @Table(name="gallery_object")
 * @author Ward Peeters <ward@coding-tech.com>
 * @package
 */
class Object
{
/** @Id
 * @Column(type="integer")
 * @GeneratedValue
 * @var int */
protected $id;
/** @ManyToMany(targetEntity="iTet\Application\Modules\Media\Models\Entities\Media")
 * @JoinTable(name="media_relations",
 *   joinColumns={@JoinColumn(name="typeid", referencedColumnName="id")},
 *   inverseJoinColumns={@JoinColumn(name="mediaid", referencedColumnName="id")}
 * )
 * @var Media */
protected $file;
/** @Column
 * @var string */
protected $tag;
/** @Column(type="integer")
 * @var bool */
protected $deleted = false;

【问题讨论】:

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


    【解决方案1】:

    据我所知,您的选择如下:

    1. 引入一个实体来表示media_relations 表中的条目,以及与其他表的适当关联。
    2. 通过类表继承引入“媒体关系”层次结构(以模拟不同的“类型”)并仅查询“画廊”类型。 Doctrine inheritance documentation.

    在这两种情况下,您都需要将基础表公开给 Doctrine,这样您就可以使用 DQL 来获取您需要的数据。

    HTH

    【讨论】:

    • 我也认为这是最好的方法,但我认为第二种方法更干净。我想也许有一些我在文档中没有看到的东西,但我想它必须是这样的。
    猜你喜欢
    • 2018-07-19
    • 1970-01-01
    • 2023-02-02
    • 1970-01-01
    • 2014-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多