2016-10-08 3 views
0

Ich modifiziere CRUD erstellt von Doktrin in Symfony 2.8. Ich habe 2 Tabellen (provedores (Anbieter) und productos (Produkte)) mit einer Beziehung 1: n. Ich möchte durch die Indexaktion die vollständige Liste der Produkte mit ihren Anbietern zeigen, die es besitzt. Was ich versuche, ist ein DQL-Satz zu erstellen, der die 2 Tabellen im Ergebnis verbindet und dann mit Zweig bearbeiten. Wenn ich versuche, auf den Index zuzugreifen, bekomme ich den Fehler erwähnt.Doktrin symfony2 Fehler: Klasse Cocina ComprasBundle Entity Productos hat keine Zuordnung namens 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

Ich habe eine andere ähnliche Threads überarbeitet hier aber ich habe keine Lösung gefunden. Ich habe auch alle Doktrin-Caches und Symfony-Cache gelöscht, aber nichts. Danke für die Antworten.

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

Namespace 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

+0

In der Klasse 'Productos' umbenennen das Attribut' $ idProveedor' mit '$ proveedores' – Matteo

Antwort

0

Im Entity Productos wird die Beziehung idProveedor statt proveedores benannt. Also versuchen Sie diese Abfrage:

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

this helps

NB: Wie schon in früheren Kommentar wahrscheinlich besser ist die Umbenennung der Beziehung wie in der Abfrage als proveedores erwartet

+1

yeah ... das war das Problem. Vielen Dank – viejalospelos

+0

hi @viejalospelos Sie sind herzlich willkommen! – Matteo

0

Es Sie Beitritt richtig sind nicht scheint. Es sollte in etwa so aussehen: FROM Tabellenname INNER JOIN anderer Tabellenname.someid = anderer Tabellenname.someid.

Aber mit der Doktrin müssen Sie das nicht tun. Sie können einfach eine Funktion von Ihrer Entität aufrufen.

Siehe this. Sie sollten Ihre Getter und Setter generieren. (etwas wie PHP bin/Console Doktrin: generieren: Entitäten AppBundle).

Dann können Sie nur Ihre Produkte abfragen (Pseudocode nicht getestet).

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

Und dann haben Sie Ihre Beweise in Ihren Objekten. Es gibt wahrscheinlich ein Array von Objekten zurück. Pseudo-Code:

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

danke für deine Antwort. Setter und Getter sind in den Entitäten, aber ich musste den Code abschneiden, weil er so lang war. Ich kann findAll() ohne Probleme verwenden und ich hatte keine Probleme mit Daten-Fixtures mit dem Modell, in der Tat füllen die Datenbanken mit den Daten Fixtures erkennt es die Assoziationen.Wenn Sie den Controller sehen, können Sie eine kommentierte Zeile sehen, die gut funktioniert und eine findAll() enthält, aber nur für eine Entität. Ich muss die Daten der zwei Tabellen wiederherstellen, weil ich alle Produkte mit seinen Lieferanten zeigen muss – viejalospelos

Verwandte Themen