我有这个型号:
/** @Entity @Table(name="articles") */
class Article {
/** @Id @GeneratedValue @Column(type="integer") */
protected $id;
/** @Column(type="string", length=100, nullable=true) */
protected $title;
/** @ManyToOne(targetEntity="User", inversedBy="articles") */
protected $author;
/** @Column(type="datetime") */
protected $datetime;
/**
* @ManyToMany(targetEntity="Game", inversedBy="articles")
* @JoinTable(name="articles_games",
* joinColumns={@JoinColumn(name="article_id", referencedColumnName="id")},
* inverseJoinColumns={@JoinColumn(name="game_id", referencedColumnName="id")}
* )
*/
protected $games;
# Constructor
public function __construct() {
$this->datetime = new DateTime();
$this->games = new \Doctrine\Common\Collections\ArrayCollection();
}
# ID
public function getId() { return $this->id; }
# TITLE
public function setTitle($v) { $this->title = $v; }
public function getTitle() {
if(empty($this->title)) {
$game = $this->getFirstGame();
return ($game instanceof Game) ? $game->getTitle() : NULL;
} else
return $this->title;
}
# AUTHOR
public function setAuthor($v) { $this->author = $v; }
public function getAuthor() { return $this->author; }
# DATE & TIME
public function getDateTime() { return $this->datetime; }
public function setDateTime($v) { $this->datetime = $v; }
# GAMES
public function setGames($value) {
$except_txt = 'Jedna z przesłanych wartości nie jest instancją klasy Game!';
if(is_array($value)) {
foreach($value as $v) {
if($v instanceof Game) $this->games->add($v);
else throw new Exception($except_txt);
}
} else {
if($value instanceof Game) $this->games->add($value);
else throw new Exception($except_txt);
}
}
public function getGames() { return $this->games; }
}
如何使查询看起来像这样
SELECT a FROM Article a WHERE :game_id IN a.games
我有这个($game->getId()
是一个整数)
$articles = $db->createQuery("SELECT a.type FROM Article a WHERE :game_id IN a.games GROUP BY a.type")->setParameter('game_id', $game->getId())->getResult();
但它给我的语法错误
[Syntax Error] line 0, col 47: Error: Expected Doctrine\ORM\Query\Lexer::T_OPEN_PARENTHESIS, got 'a'
答案 0 :(得分:12)
这个问题与a more recent question that I just answered有关,我觉得把它放在这里也是有益的,因为这是一个更正确的解决方案:
Doctrine IN
函数需要在(1, 2, 3, 4, ...)
语句之后使用IN
格式。不幸的是,它不适用于列条件来证明成员资格。
但是,我相信你正在寻找MEMBER OF
学说功能:
SELECT a FROM Article a WHERE :game_id MEMBER OF a.games
您可以使用此功能将有效的Doctrine对象或标识符传递到game_id
。
此示例隐藏在Doctrine docs:
的深处$query = $em->createQuery('SELECT u.id FROM CmsUser u WHERE :groupId MEMBER OF u.groups');
$query->setParameter('groupId', $group);
$ids = $query->getResult();
答案 1 :(得分:6)
如果您正在寻找与一款游戏相关的文章:
$articles = $db->createQuery("SELECT a FROM Article a JOIN a.games game WHERE game.id = :game_id")
->setParameter('game_id', $game->getId())
->getResult();
或多个:
$articles = $db->createQuery("SELECT a FROM Article a JOIN a.games game WHERE game.id IN (?,?, ... ?)")
->setParameters(array($game1->getId(), $game2->getId() ... $gameN->getId()))
->getResult();
答案 2 :(得分:1)
我猜你需要为此创建一个自定义存储库。我刚刚解决了这个问题。
使用Doctrine \ ORM \ EntityRepository;
class Company extends EntityRepository
{
/**
* Load by product.
* @param int $productId
* @return array
*/
public function getByProduct($productId)
{
$dql = "SELECT i FROM Domain\Model\Company i JOIN i.products p WHERE p.id = :id";
return $this->_em->createQuery($dql)->setParameter(':id', $productId)->getResult();
}
}