Symfony加入了很多对很多人

时间:2015-06-30 07:31:01

标签: php mysql entity-framework symfony

我想知道如何加入另一个联接。

我的QueryBuilder

return $this->createQueryBuilder("t")
->leftjoin("t.playlist","p","WITH","p.genres=:genreP")
->setParameter(":genreP",$genre)
->addSelect("p")
->getQuery()
->getResult()
;

我有这个错误:[语义错误]第0行,第170行'genres =:genreP'附近:错误:无效的PathExpression。期望StateFieldPathExpression或SingleValuedAssociationField。

我想做什么:

我有趋势实体,该实体与播放列表实体具有OneToOne关系。播放列表实体与的关系ManyToMany >类型实体。

趋势实体:

class Trending
{
/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
*@ORM\OneToOne(targetEntity="Song", inversedBy="trending")
*/
private $song;

/**
*@ORM\OneToOne(targetEntity="Album", inversedBy="trending")
*/
private $album;

/**
*@ORM\OneToOne(targetEntity="Playlist", inversedBy="trending")
*/
private $playlist;
}

播放列表实体

class Playlist
{
/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @var string
 *
 * @ORM\Column(name="titre", type="string", length=255)
 */
private $titre;

/**
* @ORM\Column(name="public", type="boolean")
*/
private $public = true;

/**
*@ORM\ManyToOne(targetEntity="user", inversedBy="playlists")
*@ORM\joinColumn(nullable=false)
*/
private $user;

/**
*@ORM\ManyToMany(targetEntity="Song", inversedBy="playlists")
*@ORM\joinColumn(nullable=false)
*/
private $songs;

/**
*@ORM\ManyToMany(targetEntity="Genre", inversedBy="playlists")
*/
private $genres;

/**
*@ORM\OneToOne(targetEntity="Image", cascade={"persist","remove","refresh"})
*/
private $image;

/**
*@ORM\ManyToMany(targetEntity="user", inversedBy="playlistLikes")
*@ORM\JoinTable(name="playlist_likes")
*/
private $likes;

/**
*@ORM\Column(name="played", type="integer")
*/
private $played;

/**
*@ORM\ManyToMany(targetEntity="user", inversedBy="playlistDislikes")
*@ORM\JoinTable(name="playlist_dislikes")
*/
private $dislikes;

/**
*@ORM\Column(name="description", type="text", nullable=true)
*/
private $description;

/**
*@ORM\ManyToMany(targetEntity="Langue", inversedBy="playlist")
*/
private $languages;

/**
*@ORM\Column(name="lien", type="string", length=255)
*/
private $lien;

/**
*@ORM\OneToOne(targetEntity="Trending", mappedBy="playlist", cascade=    {"persist","remove"})
*/
private $trending;
}

趋势表

id | playlist_id | song_id | album_id
54 | 9           | null    | null

播放列表

id | title
9  | My best

playlist_genre表

playlist_id | genre_id
9           | 1
9           | 4

流派表

id | name
1  | Hip Hop
2  | Konpa
3  | Electronic
4  | Reggae

我想选择genre_id为4的任何播放列表。

感谢。

2 个答案:

答案 0 :(得分:0)

您是否尝试过CONTAINS功能?

->leftjoin("t.playlist","p","WITH","p.genres CONTAINS :genreP")

编辑:如果包含在联接中不起作用,您可以随时在as where子句上尝试

答案 1 :(得分:0)

抱歉这个愚蠢的问题。 我只是通过两个连接来解决它。

->leftjoin("t.playlist","p")
->leftjoin("p.genres","g")
->addSelect("p")
->where("g = :g")
->setParameter(":g",$genre)

这很有效。如果有人有更好的想法来优化请求,我不仅仅会感兴趣!