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

Posted

技术标签:

【中文标题】学说 symfony2 错误:Cocina\\ComprasBundle\\Entity\\Productos 类没有名为proveedores 的关联【英文标题】:doctrine symfony2 Error: Class Cocina\ComprasBundle\Entity\Productos has no association named proveedores学说 symfony2 错误:Cocina\ComprasBundle\Entity\Productos 类没有名为proveedores 的关联 【发布时间】:2016-10-08 17:31:19 【问题描述】:

我正在修改 symfony 2.8 中由学说生成的 CRUD。我有 2 个表(proveedores(providers) 和 productos(products)),关系为 1:n。 我想通过索引操作显示其拥有的供应商的完整产品列表。 我尝试的是创建一个 DQL 语句,将结果中的 2 个表连接起来,然后用 twig 对其进行操作。 当我尝试访问索引时,我得到了提到的错误。

[语义错误] 第 0 行,第 75 列靠近“x”:错误:类 Cocina\ComprasBundle\Entity\Productos 没有名为的关联 证明人

[2/2] QueryException: [Semantical Error] line 0, col 75 near 'x': 错误:Cocina\ComprasBundle\Entity\Productos 类没有关联 命名证明者

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

我在这里修改了另一个类似的线程,但我没有找到解决方案。 我也检查过清除所有的学说缓存和 symfony 缓存,但什么也没有。 感谢您的回答。

实体证明者

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)
...

实体产品

命名空间 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;

...

产品资料库

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();


控制器

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

【问题讨论】:

Productos类中将属性$idProveedor重命名为$proveedores 【参考方案1】:

在 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

【讨论】:

是的……这就是问题所在。非常感谢【参考方案2】:

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

但是,有了原则,您就不需要这样做了。你可以从你的实体中调用一个函数。

见this。 您应该生成您的 getter 和 setter。 (类似于 php bin/console 学说:generate:entities AppBundle)。

然后您就可以查询您的产品(伪代码未测试)。

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

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

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

【讨论】:

感谢您的回答。 Setter 和 getter 在实体中,但我不得不削减代码,因为它太长了。我可以毫无问题地使用 findAll() 并且在模型中使用数据夹具也没有问题,事实上,它使用它识别关联的数据夹具填充数据库。如果您看到控制器,您会看到一条工作正常的注释行,它包含 findAll() 但仅在实体上。我需要恢复这两个表的数据,因为我需要显示所有产品及其供应商

以上是关于学说 symfony2 错误:Cocina\ComprasBundle\Entity\Productos 类没有名为proveedores 的关联的主要内容,如果未能解决你的问题,请参考以下文章

Symfony2,学说和数据域

未定义索引:joinColumns 学说 + symfony2

Symfony2 和空关系的学说

Symfony2 学说清除缓存

symfony2 学说加入

Symfony2:学说“找不到驱动程序”