2016-10-08 26 views
0

我正在修改symfony 2.8中由doctrine生成的CRUD。我有2個表(證明(提供者)和productos(產品))與關係1:n。 我希望通過索引操作顯示其擁有的提供商的完整產品列表。 我嘗試的是創建一個DQL語句,將結果中的兩個表連接起來,然後用樹枝操縱它。 當我嘗試訪問索引時,出現上述錯誤。doctrine symfony2錯誤:Class Cocina ComprasBundle Entity Productos沒有名爲proveedores的關聯

[Semantical Error] line 0, col 75 near 'x ': Error: Class Cocina\ComprasBundle\Entity\Productos has no association named proveedores

[2/2] QueryException: [Semantical Error] line 0, col 75 near 'x ': Error: Class Cocina\ComprasBundle\Entity\Productos has no association named proveedores

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

我修改了另一個類似的線程在這裏,但我沒有找到解決方案。 我檢查太清除所有的教條緩存和symfony緩存但沒有。 感謝您的答案。

實體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) 
... 
} 

實體PRODUCTOS

命名空間COCINA \ ComprasBundle \實體;

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

控制器

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

+0

在類'Productos'重命名屬性' $ idProveedor' with'$ proveedores' – Matteo

回答

0

在實體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

+1

是啊...這是問題。非常感謝你 – viejalospelos

+0

嗨@viejalospelos歡迎您! – Matteo

0

看來你是不正確的加盟。它應該是這樣的:FROM tablename INNER JOIN othertablename ON tablename.someid = othertablename.someid。

然而,與教義你不需要那樣做。你可以從你的實體調用一個函數。

請參閱this。 你應該生成你的getter和setter。 (類似於php bin/console doctrine:generate:entities AppBundle)。

然後,您可以只查詢您的productos(僞代碼未測試)。

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

然後你在你的對象中有你的證明。它可能會返回一個對象數組。僞代碼:

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

感謝您的回答。安裝者和獲取者都在實體中,但我必須縮短代碼,因爲它太長了。我可以在沒有問題的情況下使用findAll(),並且在模型中使用數據裝置時沒有任何問題,實際上用數據裝置填充數據庫以識別關聯。如果你看到控制器,你可以看到一個工作正常的註釋行,它包含一個findAll(),但只包含在一個實體上。我需要恢復兩個表的數據,因爲我需要顯示所有產品與其供應商 – viejalospelos

相關問題