2013-05-18 26 views
5

tôi có chương trình cơ sở dữ liệu sau đây:Symfony2 thuyết có được sản phẩm ngẫu nhiên từ một loại

table 'products' 
id 
category_id 

và dĩ nhiên là một bảng category, chỉ với một id.

Dữ liệu trông giống như thế:

Products 
-------------------- 
| id | category_id | 
-------------------- 
| 0 | 1   | 
| 1 | 1   | 
| 2 | 1   | 
| 3 | 2   | 
| 4 | 2   | 
| 5 | 1   | 
-------------------- 

Tôi muốn chọn một danh mục (ví dụ loại 1), vì vậy tôi chọn tất cả các hàng từ loại đó trong lớp sản phẩm kho của tôi:

return $this 
    ->createQueryBuilder('u') 
    ->andWhere('u.category = :category') 
    ->setMaxResults(1) 
    ->setParameter('category', $category->getId()) 
    ->getQuery() 
    ->getSingleResult() 
; 

Bây giờ tôi có thể chọn một sản phẩm ngẫu nhiên? Ngoài ra: Có thể giải quyết vấn đề này thông qua các mối quan hệ không?

Tôi có một mối quan hệ giữa các thực thể OneToMany "Thể loại" và "sản phẩm", vì vậy tôi cũng có thể nhận được tất cả các sản phẩm qua Category-> GetProducts() ...

Bất kỳ trợ giúp sẽ được thực sự hữu ích, thanks

Trả lời

12

Trước tiên, bạn phải tính tổng số sản phẩm, sau đó tạo ra một bù trừ ngẫu nhiên để chọn một sản phẩm ngẫu nhiên.

Điều này sẽ giúp bạn bắt đầu:

$count = $this->createQueryBuilder('u') 
      ->select('COUNT(u)') 
      ->getQuery() 
      ->getSingleScalarResult(); 

Và sau đó bạn có thể tạo ra một số ngẫu nhiên giữa 1 và tổng số hàng.

return $this->createQueryBuilder('u') 
    ->where('u.category = :category') 
    ->setFirstResult(rand(0, $count - 1)) 
    ->setMaxResults(1) 
    ->setParameter('category', $category->getId()) 
    ->getQuery() 
    ->getSingleResult() 
; 

Những dịch để:

SELECT * FROM products WHERE category_id = ? LIMIT 1, {random offset} 
+0

nên 'getResult' trên truy vấn số không được ' getSingleScalarResult'? – Machiel

+0

Tôi biết đoạn mã này hoạt động khi tôi trả lời, nhưng tôi đã không chạm vào Doctrine trong một thời gian để mọi thứ có thể đã thay đổi. –

+1

Đây là một chức năng sẵn sàng để sử dụng: https://gist.github.com/Thinkscape/124d658e4076421c0516 –

0

Sử dụng chức năng helper này:

<?php 
use Doctrine\ORM\EntityManager; 

/** 
* Retrieve one random item of given class from ORM repository. 
* 
* @param EntityManager $em The Entity Manager instance to use 
* @param string  $class The class name to retrieve items from 
* @return object 
*/ 
function getRandomDoctrineItem(EntityManager $em, $class) 
{ 
    static $counters = []; 
    if (!isset($counters[$class])) { 
     $this->counters[$class] = (int) $this->manager->createQuery(
      'SELECT COUNT(c) FROM '. $class .' c' 
     )->getSingleScalarResult(); 
    } 
    return $em 
     ->createQuery('SELECT c FROM ' . $class .' c ORDER BY c.id ASC') 
     ->setMaxResults(1) 
     ->setFirstResult(mt_rand(0, $counters[$class] - 1)) 
     ->getSingleResult() 
    ; 
} 

Ví dụ sử dụng:

$randomItem = getRandomDoctrineItem($em, 'Application\Entity\Post'); 
Các vấn đề liên quan