doctrine symfony2错误:类Cocina \ ComprasBundle \ Entity \ Productos没有名为proveedores的关联

时间:2016-10-08 17:31:20

标签: symfony doctrine-orm

我在symfony 2.8中修改了由教义生成的CRUD。我有2个表(证明者(提供者)和产品(产品)),关系为1:n。 我希望通过索引操作显示与其拥有的提供商的完整产品列表。 我尝试创建一个DQL语句,连接结果中的2个表,然后用twig操作它。 当我尝试访问索引时,我收到了提到的错误。

  

[语义错误]第0行,第75行附近' x':错误:类   Cocina \ ComprasBundle \ Entity \ Productos没有名称的关联   证明者

     

[2/2] QueryException:[语义错误]第0行,第75行附近' x':   错误:类Cocina \ ComprasBundle \ Entity \ Productos没有关联   名为provedores的

     

[1/2] QueryException:SELECT p,x FROM ComprasBundle:Productos p JOIN   p.proveedores x

我在这里修改了另一个类似的线程,但我找不到解决方案。 我已经检查过清除所有的doctrine缓存和symfony缓存,但没有。 谢谢你的回答。

ENTITY PROVEEDORES

namespace Cocina\ComprasBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Proveedores
 *
 * @ORM\Table(name="proveedores")
 * @ORM\Entity(repositoryClass="Cocina\ComprasBundle\Repository\ProveedoresRepository")
 */
class Proveedores
{
private $id;

/**
 * @var string
 *
 * @ORM\Column(name="nombre", type="string", length=255, unique=true)
...
}

ENTITY PRODUCTOS

命名空间Cocina \ ComprasBundle \ Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Productos
 *
 * @ORM\Table(name="productos")
 * @ORM\Entity(repositoryClass="Cocina\ComprasBundle\Repository\ProductosRepository")
 */
class Productos
{
/**
 * @var integer $idProveedor
 * @ORM\ManyToOne(targetEntity="Proveedores")
 * @ORM\JoinColumn(name="id_proveedor_id", referencedColumnName="id")
 */
private $idProveedor;

...
}

PRODUCTOS REPOSITORY

namespace Cocina\ComprasBundle\Repository;

use Doctrine\ORM\EntityRepository;

/**
 * ProductosRepository
 *
 * This class was generated by the Doctrine ORM. Add your own custom
 * repository methods below.
 */
class ProductosRepository extends EntityRepository
{
public function findListaProductos()
{
    $em=$this->getEntityManager();
    $consulta=$em->createQuery('
            SELECT p,x
            FROM ComprasBundle:Productos p 
            JOIN p.proveedores x            
            ');
    return $consulta->getResult();
}
}

CONTROLLER

namespace Cocina\ComprasBundle\Controller;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;

use Cocina\ComprasBundle\Entity\Productos;
use Cocina\ComprasBundle\Form\ProductosType;

/**
 * Productos controller.
 *
 */
class ProductosController extends Controller
{
/**
 * Lists all Productos entities.
 *
 */
public function indexAction()
{
    $em = $this->getDoctrine()->getManager();

    //$productos = $em->getRepository('ComprasBundle:Productos')->findAll();
    $productos=$em->getRepository('ComprasBundle:Productos')->findListaProductos()->getResult();

    return $this->render('ComprasBundle:productos:index.html.twig', array(
        'productos' => $productos,
    ));
}

RELATIONSHIP SCHEMA

2 个答案:

答案 0 :(得分:0)

您似乎没有正确加入。它应该是这样的:FROM tablename INNER JOIN othertablename ON tablename.someid = othertablename.someid。

然而,有了教义,你不需要这样做。您只需从您的实体中调用一个函数即可。

this。 你应该生成你的getter和setter。 (类似于php bin / console doctrine:generate:entities AppBundle)。

然后你可以查询你的产品(伪测试未测试)。

     $productos = $this->getDoctrine()
    ->getRepository('ComprasBundle:Productos')
    ->findAll() or fetchAll();

然后你的对象中有你的证明。它可能返回一个对象数组。伪代码:

      $firstproductprovidername  = $productos[0]->getProveedores()->getName();
      $firstproductproviderid  = $productos[0]->getProveedores()->getId();

答案 1 :(得分:0)

在Entity Productos中,关系名为idProveedor,而不是proveedores。所以试试这个查询:

public function findListaProductos()
{
    $em=$this->getEntityManager();
    $consulta=$em->createQuery('
            SELECT p,x
            FROM ComprasBundle:Productos p 
            JOIN p.idProveedor x            
            ');
    return $consulta->getResult();
}

希望这有帮助

注意:因为之前的评论可能更好地将您的查询中的关系重命名为proveedores