Как получить сущности на основе значений полей в другой сущности в Doctrine2? - PullRequest
1 голос
/ 28 октября 2011

У меня есть сущность 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 available равное 1. Ergo.Получить подкатегории, в которых есть только доступные продукты.

Я знаю, как написать SQL запрос для этого, но я не знаю, как этого добиться в DQL.

Должен ли япредоставить дополнительную аннотацию?

Ответы [ 2 ]

3 голосов
/ 28 октября 2011

Вы должны начать с объявления отношений в ваших сущностях. Я предполагаю, что в вашей подкатегории может быть много продуктов (один ко многим):

Я не проверял этот код, очевидно, поэтому я прошу прощения, если есть какие-то ошибки, это в основном не в моей голове.

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

Теперь, поскольку у нас есть защищенные переменные в нашей сущности, вам нужны сеттеры и геттеры для ваших объектов. Это может быть очень полезно для форматирования возврата содержимого и т. Д.

foreach ($results as $product)
{
     $products[] = array("id" => $product->getId(),
                         "name" => $product->getName(),
                         "subCategory" => $product->getSubcategoryId()                           
                          );
 }
0 голосов
/ 28 октября 2011

Читать о сопоставлении ассоциаций: http://www.doctrine -project.org / docs / orm / 2.1 / ru / reference / association-mapping.html

...