Doctrine2:如何使用DQL选择ArrayCollection

时间:2016-07-12 05:24:30

标签: php mysql symfony doctrine-orm doctrine

我有两个实体OneToMany只按照教义文档中描述的方式进行映射:

 // Product Entity
 /**
  * @OneToMany(targetEntity="Feature", mappedBy="product")
  */
  private $features;

 // Feature Entity    
 /**
  * @ManyToOne(targetEntity="Product", inversedBy="features")
  * @JoinColumn(name="product_id", referencedColumnName="id")
  */
  private $product;

当我在findAll()Product时,它会返回数组为Feature的产品。

我正在使用DQL进行查询,因此我想知道如何使用Feature选择DQL数组。

我做了:SELECT p.name, p.price, f FROM Product p JOIN p.features f

但是它会出错

  

如果不选择至少一个根实体别名,则无法通过标识变量选择实体。

我也尝试过:SELECT p.name, p.price, p.features FROM Product p

也会出错

  

无效的PathExpression。必须是StateFieldPathExpression。

2 个答案:

答案 0 :(得分:1)

问题是,如果没有获取包含它的产品,则无法获取功能实体。所以你必须这样做

SELECT p , f FROM Product p JOIN p.features f

希望这对你有所帮助。

答案 1 :(得分:0)

@abdiel给出正确的解决方案

<?php
$serverhost = "localhost";
$pass = "";
$dbname = "website_db";
$table = "";

// Create connection
$connect = mysqli_connect($serverhost, $user, $pass, $dbname);

// Check connection
if (!$connect) {
die("Failed to connect to DataBase: " . mysqli_connect_error());
}

// SQL Variable
$sql = "insert into accounts (Steam ID)
VALUES ('YAY')";


// SQL query
if (mysqli_query($connect, $sql)) {
echo "Succesfully Inserted Data to Table";
} else {
echo "Error: " . $sql . "<br>" . mysqli_error($connect);
}

// END
mysqli_close($connect);
?>

然后例如在控制器中:

class ProductsRepository extends \Doctrine\ORM\EntityRepository
{

    public function getAllProductsWithFeatures()
    {
        $dql = 'SELECT p , f FROM Product p JOIN p.features f';
        $query = $this->getEntityManager()->createQuery($dql);
        return $query->getResult();
    }

}

所有产品都将预装功能集。

祝你好运!