我想知道如何加入另一个联接。
我的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的任何播放列表。
感谢。
答案 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)
这很有效。如果有人有更好的想法来优化请求,我不仅仅会感兴趣!