选择带有学说的查询

时间:2014-05-07 08:18:47

标签: symfony doctrine select-query

我试图用doctrine创建一个select查询,但它没有用。 我有三个表,产品(ID,名称),客户(ID,名称),订单(产品,客户)。 我需要选择并显示客户所做的所有订单,以及产品名称。 如何使用doctrine进行此特定查询? 对不起,如果这是一个平庸的问题...

货号:

<?php
namespace Example\Bundle\CrudBundle\Entity;
use Doctrine\ORM\Mapping as ORM;

/**
 * Product
 */
class Product
{
/**
 * @var string
 */
private $name;

/**
 * @var string
 */
private $prize;

/**
 * @var integer
 */
private $id;


/**
 * Set name
 *
 * @param string $name
 * @return Product
 */
public function setName($name)
{
    $this->name = $name;

    return $this;
}

/**
 * Get name
 *
 * @return string 
 */
public function getName()
{
    return $this->name;
}

/**
 * Set prize
 *
 * @param string $prize
 * @return Product
 */
public function setPrize($prize)
{
    $this->prize= $prize;

    return $this;
}

/**
 * Get prize
 *
 * @return string 
 */
public function getprize()
{
    return $this->prize;
}

/**
 * Get id
 *
 * @return integer 
 */
public function getId()
{
    return $this->id;
}
}

客户端:

<?php
namespace Example\Bundle\CrudBundle\Entity;
use Doctrine\ORM\Mapping as ORM;

/**
* Client
*/
class Client
{
/**
 * @var string
 */
private $name;

/**
 * @var string
 */
private $age;

/**
 * @var integer
 */
private $id;


/**
 * Set name
 *
 * @param string $name
 * @return Client
 */
public function setName($name)
{
    $this->name = $name;

    return $this;
}

/**
 * Get name
 *
 * @return string 
 */
public function getName()
{
    return $this->name;
}

/**
 * Set age
 *
 * @param string $age
 * @return Client
 */
public function setAge($age)
{
    $this->age = $age;

    return $this;
}

/**
 * Get age
 *
 * @return string 
 */
public function getAge()
{
    return $this->age;
}

/**
 * Get id
 *
 * @return integer 
 */
public function getId()
{
    return $this->id;
}

}

订单:

<?php
namespace Example\Bundle\CrudBundle\Entity;
use Doctrine\ORM\Mapping as ORM;

/**
 * Orders
 */
class Orders
{
/**
 * @var integer
 */
private $idProduct;

/**
 * @var integer
 */
private $idIngrediente;


/**
 * Set idProduct
 *
 * @param integer $idProduct
 * @return Orders
 */
public function setIdProduct($idProduct)
{
    $this->idProduct = $idProduct;

    return $this;
}

/**
 * Get idProduct
 *
 * @return integer 
 */
public function getIdProduct()
{
    return $this->idProduct;
}

/**
 * Set idClient
 *
 * @param integer $idClient
 * @return Orders
 */
public function setIdClient($idIngrediente)
{
    $this->idClient= $idClient;

    return $this;
}

/**
 * Get idClient
 *
 * @return integer 
 */
public function getIdClient()
{
    return $this->idClient;
}
}

这就是我尝试进行查询的方法,首先检查产品是否在表中,然后从Orders和Product表中选择我需要的字段。

class ProductRepository extends EntityRepository
{
    public function findAllOrderedByName()
    {
        return $this->getEntityManager()
            ->createQuery(
                'SELECT * FROM ExampleCrudBundle:Product p ORDER BY p.name ASC'
            )
            ->getResult();
    }
}


public function findOneByIdJoinedToCategory($id)
{
    $query = $this->getEntityManager()
        ->createQuery('
            SELECT p, c FROM ExampleCrudBundle:Product p
            JOIN p.category c
            WHERE p.id = :id'
        )->setParameter('id', $id);

    try {
        return $query->getSingleResult();
    } catch (\Doctrine\ORM\NoResultException $e) {
        return null;
    }
}

2 个答案:

答案 0 :(得分:1)

  1. 你可能想要使用$ em-&gt; getRepository(“ExampleCrudBundle:Product”) - &gt; createQueryBuilder('p')         - &gt; leftJoin(“p.category c”)

  2. 你需要阅读更多关于教义的内容,一方面,你不需要为ManyToMany关系定义表,doctrine会为你做这些,另一方面,定义这样的表是不够的,因为你需要表明存在关系的学说:产品 - 类别。

  3. 你现在做的是:

    “为我提供类别为X的产品”,但您的产品实体中没有关于类别的信息

    请阅读http://docs.doctrine-project.org/en/2.0.x/reference/association-mapping.html关于“ManyToMany”的关系以及关系。

答案 1 :(得分:0)

您是否阅读过文档?

http://doctrine-orm.readthedocs.org/en/latest/reference/dql-doctrine-query-language.html

这是您执行选择查询的方式:

<?php
$query = $em->createQuery('SELECT u FROM MyProject\Model\User u WHERE u.age > 20');
$users = $query->getResult();