如何根据Doctrine 2中另一个实体中的字段值获取实体?

时间:2011-10-28 14:23:01

标签: php doctrine-orm dql

我有实体Product和实体Subcategory

Subcategory.php

namespace Project\Entities;    

/**
 * Subcategory 
 * @Entity
 * @Table(name="subcategories")
 *
 */
class Subcategory {
/**
 * 
 * @Id 
 * @GeneratedValue 
 * @Column(type="integer")
 * @var integer $id
 */
public $id;

/**
 * @Column(type="string")
 * @var string $name
 */
public $name;
}

Product.php

namespace Project\Entities;

/**
 * 
 * Product 
 * @Entity
 * @Table(name="products")
 */
class Product {
    /**
     * 
     * @Id 
     * @GeneratedValue 
     * @Column(type="integer",length=16)
     * @var integer $id
     */
    public  $id;

    /**
     * 
     * @Column(type="integer",length=3)
     * @var integer $id_subcat
     */
    public $id_subcat;

    /**
     * 
     * @Column(type="string")
     * @var integer $name
     */
    public $name;


    /**
     * 
     * @Column(type="string")
     * @var integer $available
     */
    public $available;
}

我希望Subcategories Products字段等于1的所有available。 人机工程学。获取仅包含可用产品的子类别。

我知道如何编写SQL查询,但我不知道如何在DQL中实现此目的。

我应该提供一些额外的注释吗?

2 个答案:

答案 0 :(得分:3)

您必须首先声明实体中的关系。我将假设您的子类别可以包含许多产品(一对多):

我没有明显测试过这段代码,所以如果有一些错误我会道歉,这主要是我的头脑。

/**
 * Subcategory 
 * @Entity
 * @Table(name="subcategories")
 *
 */
class Subcategory {
    /**
     * @OneToMany(targetEntity="Project\Entities\Product", mappedBy="id_subcat")
     * @var Products[]
     */
    protected $products;

    public function __construct()
    {
             $this->products = new \Doctrine\Common\Collections\ArrayCollection();
    }

    // Leaving out rest of class for simplicity...
}


/**
 * 
 * Product 
 * @Entity
 * @Table(name="products")
 */
class Product {

    // Rest of class....

    /**
     * @ManyToOne(targetEntity="Project\Entities\Subcategory", inversedBy="products")
     * @JoinColumn(name="id_subcat", referencedColumnName="id")
     */
     protected $id_subcat = null;

}

**然后在SF2中查询它是这样的:

/* var \Doctrine\ORM\EntityManager $em */
$dql = "SELECT p FROM Project\Entities\Product p JOIN p.subcategoryId sc ORDER BY p.name ASC"
$query = $em->createQuery($dql);
$results = $query->getResult();
$products = array();

现在,因为我们的实体中有保护变量,所以你需要在对象上设置setter和getter。 这对于格式化内容的返回等非常有用。

foreach ($results as $product)
{
     $products[] = array("id" => $product->getId(),
                         "name" => $product->getName(),
                         "subCategory" => $product->getSubcategoryId()                           
                          );
 }

答案 1 :(得分:0)