我有实体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
中实现此目的。
我应该提供一些额外的注释吗?
答案 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)