【问题标题】:Symfony2-Doctrine -- Selecting data with WHERE from DoctrineArraySymfony2-Doctrine -- 从 DoctrineArray 中使用 WHERE 选择数据
【发布时间】:2013-08-22 17:31:56
【问题描述】:

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

/**
 * @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 子句来检查该数组中的字段?

【问题讨论】:

  • 不。您不能查询数组值。如果您检查您的数据库,您将看到它实际上存储为一个字符串。数组类型是持久化数组的原则扩展。数据库本身对它们一无所知。如果你想做这种查询,那么你需要用它自己的表创建一个名为 Category 的实体,并将它与你的主实体相关联。

标签: symfony doctrine-orm query-builder dbal


【解决方案1】:

看看here可能对你有帮助

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

【讨论】:

    【解决方案2】:
    $qb->select($fields)
      ->where($qb->expr()->in('s.category', $categories))
    

    【讨论】:

      【解决方案3】:

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

      请参阅 PHP/MySQL - Storing array in databaseStoring arrays in the database。如您所见,这是一种糟糕的做法。

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

      这是一个实体书的例子,它有很多类别:

      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 您现在可以正常搜索了。

      【讨论】:

        猜你喜欢
        • 2015-04-24
        • 2013-09-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多