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错误是什么?您的实体中是否列出了可用的属性?另外,试着在最后切掉订单,看看查询是否有效。