0

在一个实体中,我有一个如下所示的字段:

/**
 * @ORM\Column(type="array")
 */
protected $category;

和查询生成器

$qb = $this->createQueryBuilder('s');
$qb->select($fields)
    ->where( 's.category IN (:category)') //////////// <----
    ->orderBy('s.name', 'ASC')
    ->setParameter('category', $category_id);

所以在数据库字段类别中是 Doctrine2 Array。我想使用 QueryBuilder 从数据库中选择记录。我的问题是,我该如何使用 WHERE 子句来检查该数组中的字段?

4

3 回答 3

0

看看这里可能对你有帮助

// Instead, use $qb->expr()->in('value', array('?1')) and bind your parameter to ?1 (see section above)
public function in($x, $y); // Returns Expr\Func instance
于 2013-08-27T07:32:16.703 回答
0
$qb->select($fields)
  ->where($qb->expr()->in('s.category', $categories))
于 2013-08-27T09:30:23.787 回答
0

@Cerad给了你一个完全有效的评论。存储数组的问题之一是您没有任何搜索机会。

请参阅PHP/MySQL - 在数据库中存储数组和在数据库存储数组。如您所见,这是一种可怕的做法。

最好的方法是简单地创建一个 Category 实体,并与该类别建立 OneToMany 关系。

下面是一个实体 Book 的例子,它有很多类别:

1 创建您的类别实体:

class Category implements CategoryInterface
{
    //.....

    /**
     * Title of the category
     *
     * @ORM\Column(type="string", length=100)
     */
    protected $title;

    /**
     * Relation with your book entity for example
     *
     * @ORM\ManyToOne(targetEntity="Book", inversedBy="categories")
     * @ORM\JoinColumn(name="book_id", referencedColumnName="id")
     */
    private $book;

    /**
     * Set book
     *
     * @param BookInterface $book
     */
    public function setBook(BookInterface $book)
    {
        $this->book = $book;
    }

    /**
     * Get book
     *
     * @return BookInterface
     */
    public function getBook()
    {
        return $this->book;
    }


}

2 您的图书实体:

use Doctrine\Common\Collections\ArrayCollection;

class Book implements BookInterface
{
    /**
     * Categories for the books
     *
     * @ORM\OneToMany(targetEntity="Category", mappedBy="book")
     * @var CategoryInterface[]
     */
    protected $categories ; 

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

   /**
     * Add Categories
     *
     * @param CategoryInterface $category
     */
    public function addCategory(CategoryInterface $category)
    {
        $category->setBook($this);
        $this->categories->add($category);
    }

    /**
     * Remove Category
     *
     * @param CategoryInterface $category
     * @return bool
     */
    public function removeCategory(CategoryInterface $category)
    {
        return $this->categories->removeElement($category);
    }

    /**
     * Get Categories
     *
     * @return Doctrine\Common\Collections\Collection
     */
    public function getCategories()
    {
        return $this->categories;
    }

    /**
     * Set Categories
     *
     * @param ArrayCollection $categories
     */
    public function setCategories($categories) {

        $this->categories->clear();

        foreach ($categories as $category) {
            $this->addCategory($category);
        }

        return $this;
    }

3 您现在可以正确搜索。

于 2013-08-27T09:48:24.423 回答