Php 如何基于Doctrine2中另一个实体中的字段值获取实体?

Php 如何基于Doctrine2中另一个实体中的字段值获取实体?,php,doctrine-orm,dql,Php,Doctrine Orm,Dql,我有实体产品和实体子类别: Subcategory.php namespace Project\Entities; /** * Subcategory * @Entity * @Table(name="subcategories") * */ class Subcategory { /** * * @Id * @GeneratedValue * @Column(type="integer") * @var integer $id */ public $id

我有实体
产品
和实体
子类别

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;
}
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;
}
Product.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;
}
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;
}
我希望所有
子类别
中的
产品
可用
字段等于1。 因此。获取仅包含可用产品的子类别

我知道如何为此编写
SQL
查询,但我不知道如何在
DQL
中实现这一点


我应该提供一些附加注释吗?

阅读关联映射:

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

显然,我还没有测试过这段代码,所以如果有一些错误,我很抱歉,这大部分是我不知道的

/**
 * 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()                           
                          );
 }

在这个回复中,特别是在最后一部分,非常详细。感谢您提供有关表之间关系的信息,但实际上我希望在这个查询中获得
子类别。我澄清了我的问题以明确我的意思。我不知道您在产品表中使用哪个字段来检查可用性。。。因此,我将只调用现场可用性
$dql=“从项目\实体\子类别sc选择sc加入sc.products p,其中p.availability=1按p.name订购ASC”
您使用了
sc.products
还是
sc.product
?DQL查询使用实体中的变量映射到数据库中的字段。SQL错误是什么?您的实体中是否列出了可用的属性?另外,试着在最后切掉订单,看看查询是否有效。