سؤال

لدي كيانين مع تعيين أحادي الاتجاه متعدد إلى واحد.

هنا Product:

use Doctrine\Common\Collections\ArrayCollection;

/**
 * @Entity
 * @Table(name="Product")
 * @gedmo:TranslationEntity(class="GPos_Model_Translation_ProductTranslation")
 */
class GPos_Model_Product extends GPos_Doctrine_ActiveEntity {
    /**
     * @Id @Column(type="integer")
     * @GeneratedValue
     */
    protected $id;

    /**
     * @ManyToMany(targetEntity="GPos_Model_Category")
     * @JoinTable(name="products_categories",
     *      joinColumns={@JoinColumn(name="product_id", referencedColumnName="id")},
     *      inverseJoinColumns={@JoinColumn(name="category_id", referencedColumnName="id")}
     *      )
     */
    protected $categories;

    public function __construct() {
        $this->categories = new ArrayCollection();
    }

    public function addCategory(GPos_Model_Category $category) {
        if (!$this->categories->contains($category))
            $this->categories->add($category);
    }
}

كما ترى ، categories الفئات عبارة عن مجموعة من كيانات فئة نماذج وحدات معالجة الرسومات.

الآن ماذا? حسنا الآن أود أن استرجاع جميع المنتجات التي هي في فئة معينة ، وكذلك جميع المنتجات التي هي لا في فئة معينة.

لقد حاولت $products = GPos_Model_Product::findByCategories($category->getId()); لكن هذا أعطاني فقط
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '= '1'' at line 1 و $categoryمعرف الصورة هو 1 لذلك اعتقد انها ليست وسيلة للذهاب.أي شخص يعرف كيفية التعامل مع ذلك ?

شكرا لك!

هل كانت مفيدة؟

المحلول

اكتشفت أخيرا كيفية تحديد جميع المنتجات الموجودة في فئة بفضل https://stackoverflow.com/a/9808277/1300454.

أنا أنب حل له قليلا حتى أتمكن من تمرير مجموعة من الكيانات فئة وسوف تجد جميع المنتجات التي هي ضمن هذه الفئات.إذا أعطيت أكثر من كيان واحد ، فسيقوم بإرجاع أي منتج موجود في فئة واحدة على الأقل من الفئات المحددة.

إليك القرص الخاص بي (لقد حددت هذه الوظيفة في كيان المنتج الخاص بي):

/**
 *
 * Takes an array of GPos_Model_Category entities as parameter and returns all products in these categories
 * @param array $categories
 */
public static function findByCategories($categories) {
    $categoryArray = array();
    foreach ($categories as $category) {
        array_push($categoryArray, $category->getId());
    }
    $qb = Zend_Registry::get('entityManager')->createQueryBuilder();
    $qb ->select('p')
    ->from('GPos_Model_Product', 'p')
    ->leftJoin('p.categories', 'c')
    ->andWhere($qb->expr()->in('c.id', $categoryArray));

    return $qb->getQuery()->execute();;
}

إليك كيف تسميها:

$products_cat = GPos_Model_Product::findByCategories(array($category));

في هذه الحالة category الفئة هي كيان وحده هذا هو السبب في أنني وضعت في صفيف قبل إعطائها إلى وظيفة.

وهنا هي الطريقة التي تجد المنتجات التي ليست في فئة معينة أو قائمة فئة:

/**
 *
 * Takes an array of GPos_Model_Category entities as parameter and returns all products not in these categories
 * @param array $categories
 */
public static function findByNotCategories($categories) {
    $categoryArray = array();
    foreach ($categories as $category) {
        array_push($categoryArray, $category->getId());
    }
    $qb = Zend_Registry::get('entityManager')->createQueryBuilder();
    $qb2 = Zend_Registry::get('entityManager')->createQueryBuilder();
    $qb->select('p')
    ->from('GPos_Model_Product', 'p')
    ->where($qb->expr()->notIn('p.id',
        $qb2->select('p2.id')
        ->from('GPos_Model_Product', 'p2')
        ->leftJoin('p2.categories', 'c')
        ->andWhere($qb->expr()->in('c.id', $categoryArray))
        ->getDQL()
    ));

    return $qb->getQuery()->execute();
}

هذا هو في الواقع باستخدام تحديد فرعي.أنا اختيار جميع معرف المنتجات التي هي في فئة معينة (وهذا هو سوبسيلكت) ثم أنا اختيار جميع المنتجات التي ليست في نتيجة سوبسيلكت.يتم عملي هنا!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top