Doktrinde başka bir Entitiyede alan değerlerine göre varlıklar nasıl elde edilir?

Varlık Ürün ve varlık Alt kategori var:

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;
}

Ürünler kullanılabilir alanı 1 olan alana sahip tüm Alt Kategoriler ’i almak istiyorum. Ergo. Yalnızca mevcut ürünleri olan Alt Kategorileri'nı edinin.

Bunun için SQL sorgusunu nasıl yazacağımı biliyorum ama bunu DQL 'de nasıl yapacağımı bilmiyorum.

Biraz ek açıklama sunmalı mıyım?

1

2 cevap

Varlıklarınızdaki ilişkiyi ilan ederek başlamak zorundasınız. Alt Kategorinizin birçok Ürüne sahip olabileceğini varsayalım (bire çok):

Bu kodu açık bir şekilde test etmedim, bu yüzden bazı hatalar varsa özür dilerim, bu çoğunlukla kafamın üstündedir.

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

}

** Daha sonra sorgulamak için SF2'de şöyle olurdu:

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

Şimdi, varlığımızdaki değişkenleri koruduğumuz için, nesneleriniz üzerinde ayarlayıcılar ve alıcılar istersiniz. Bu, içeriğin nasıl iade edildiğini biçimlendirmek için çok yararlı olabilir.

foreach ($results as $product)
{
     $products[] = array("id" => $product->getId(),
                         "name" => $product->getName(),
                         "subCategory" => $product->getSubcategoryId()                           
                          );
 }
3
katma
Bu yanıtta güzel detay, özellikle son bölüm.
katma yazar cantera, kaynak
Tablolar arasındaki ilişkiler hakkında bilgi için teşekkür ederim, ama aslında bu sorguda Alt Kategoriler almayı umuyordum. Ne demek istediğimi belirtmek için sorumu açıkladım.
katma yazar pixel, kaynak
'Uygun' alanım var. DQL'inizi bir anda kontrol edecek :)
katma yazar pixel, kaynak
Ben kontrol ettim ve ürün eksik görünüyor. Sorgu, SQL hatası verdi. MySql oturumundan sorguyu şöyle görünür: SELECT s0_.id AS id0, s0_.name AS name1 alt kategorilerden s0_ INNER JOIN WHERE p1_.available = 1 ORDER BY p1_.name ASC
katma yazar pixel, kaynak
SELECT sc FROM Project \ Entity \ Alt kategori sc JOIN sc.products p WHERE p.available = 1 ORDER BY p.name ASC komutunu kullandım ve hata Sözdizimi hatası veya erişim ihlali: 1064 SQL sözdiziminizde bir hata var; '1 satırında' WHERE p1_.available = 1 ORDER BY p1_.name ASC 'yakınında kullanmak için doğru sözdizimi için MySQL sunucu sürümünüze karşılık gelen kılavuzu kontrol edin'
katma yazar pixel, kaynak
katma yazar pixel, kaynak
Kullanılabilirliği kontrol etmek için Ürünler tablonuzda hangi alanı kullandığınızı bilmiyorum ... bu yüzden alan kullanılabilirliğini arayalım. $ dql = "SELECT SC Project \ Entities \ Alt kategori sc JOIN sc.products p WHERE p.availability = 1 ORDER BY p.name ASC"
katma yazar Kurt Funai, kaynak
sc.products veya sc.product kullandınız mı? DQL sorgusu, Varlığınızdaki değişkenleri kullanarak veritabanınızdaki alanları eşler. SQL hatası neydi?
katma yazar Kurt Funai, kaynak
Varlığınızda bir mülk olarak listelenmiş mevcut var mı? Ayrıca, sonunda SİPARİŞ BY'i kesmeyi ve sorgulamanın işe yarayıp yaramadığını görün.
katma yazar Kurt Funai, kaynak
0
katma