学说 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 的关联的主要内容,如果未能解决你的问题,请参考以下文章