現在の状況
次の 4 つのモデルがあります。
プロデューサー
- ID
- 名前
- 説明
- 製品 (OneToMany -> 製品)
製品は DoctrineExtensions\Taggable\Taggable を実装します
- ID
- 名前
- プロデューサー (ManyToOne -> プロデューサー)
- タグ
タグとタグ付け
DoctrineExtensions\Taggable\Taggable で生成
ゴール
Producer リポジトリで、製品に関連付けられたタグを持つプロデューサーのリストを取得したいと考えています。
array(
array( // Producer
'id' => 1,
'name' => 'Producer A',
'description' => '...',
'tags' => array(
array( // Tag
'id' => 1,
'name' => 'Tag A'
),
array(...)
)
),
array(...)
)
そして、{% for tag in producer.tags %} {{ tag.name }} {% endfor %} と入力できるようにしたい
問題
次のような SQL クエリを作成できます (これは一時的な解決策です)。
$rsm = new ResultSetMapping;
$rsm->addScalarResult('id', 'id');
$rsm->addScalarResult('name', 'name');
$rsm->addScalarResult('slug', 'slug');
$rsm->addScalarResult('tags', 'tags');
$sql = 'SELECT p.id as id, p.name as name, p.slug as slug, GROUP_CONCAT(DISTINCT t.`name` ORDER BY t.`name` ASC SEPARATOR "||") as tags
FROM `es_producer` as p
LEFT JOIN `es_product` as pr ON pr.`producer_id` = p.id
LEFT JOIN `es_tagging` as tt ON tt.`resource_id` = pr.id
LEFT JOIN es_tag as t ON t.id = tt.`tag_id`
WHERE ISNULL(p.`deleted_at`)
GROUP BY p.id';
$query = $this->getEntityManager()->createNativeQuery($sql, $rsm);
return $query->getArrayResult();
連結された文字列として追加の「タグ」フィールドを含むプロデューサーのフィールドの配列を取得します。
質問
- フィールドを対応するオブジェクトにマップしたいのですが、tagsフィールドはProducerエンティティに属していません。そのフィールドをオブジェクトにマップするにはどうすればよいですか?
- タグをエンティティとしてマップするにはどうすればよいですか
現在、すべてのフィールドをスカラー結果としてマッピングしています。オブジェクトのすべての機能なしで配列のみを取得することを意味します。