這是我的第一個問題,所以我希望我能做到一切。學說:額外的關係(多對多)
我有2對多對多關係的原則實體,並且工作正常,但我也想在多對多的表上添加額外的檢查。問題是在DQL中,我無法到達正確的列。
我想到了2種可能性:抽象父類或本地查詢。 我會粘貼下面的原生查詢,但這不是我所希望的,因爲我們必須複製並粘貼它。
所以我想做關係+類型。所以在這個例子中我還需要檢查用於type = '圖庫'
gallery_object(表)
ID,標籤,缺失
1,贊助商,0
media_relations(表)
ID, mediaid,類型,TYPEID
1,37,長廊,1
media_files
ID,用戶ID,文件名,文件路徑,文件大小,MIME_TYPE,日期,刪除
37,如圖4所示,533882_10151332524797037_1940030593_n_20.jpg,/資源/上傳/ WWW /,82724,圖像/ JPEG,2013年1月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 <[email protected]>
* @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;
我也認爲這是最好的辦法,但我認爲第二個更清潔。我想也許有些東西我沒有在文檔中看到,但我想它應該是這樣的。 – wardpeet