2013-02-05 125 views
1

這是我的第一個問題,所以我希望我能做到一切。學說:額外的關係(多對多)

我有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; 

回答

0

據我所知,你的選擇有以下幾種:

  1. 引入一個實體來表示media_relations表中的條目以及與其他表的適當關聯。
  2. 通過類表繼承(模型化不同的'類型')和僅在'圖庫'類型上查詢來引入'媒體關係'層次結構。 Doctrine inheritance documentation.

在這兩種情況下,您都會將底層表暴露給Doctrine,以便您可以使用DQL獲取所需的數據。

HTH

+0

我也認爲這是最好的辦法,但我認爲第二個更清潔。我想也許有些東西我沒有在文檔中看到,但我想它應該是這樣的。 – wardpeet