symfony2 querybuilder onetomany generate consultas symfony doctrine

querybuilder - symfony doctrine onetomany



¿Cómo se accede a Doctrine DBAL en una clase de servicio Symfony2? (2)

Estoy aprendiendo Symfony2 (y OOP) y quiero crear un servicio que esté disponible en toda mi aplicación. Este servicio toma un valor foo, lo compara con una tabla de base de datos y devuelve una barra de valor.

Tengo una pequeña clase

namespace Acme/TestBundle/Toolbox; class StringToolbox { public function lookupSomething($foo) { $conn = $this->get(''database_connection''); $sql = "SELECT bar FROM bar_list WHERE foo = :foo"; $stmt = $conn->prepare($sql); $stmt->bindValue("foo", $foo); $stmt->execute(); return $bar; } }

Mi configuración es:

services: toolbox: class: Acme/TestBundle/Toolbox arguments: [@database_connection]

Pero arroja un error que dice que el método get () no está definido. Estoy atascado, ¿cómo puedo usar DBAL en el servicio? ¡Gracias!


En primer lugar, debe agregar un constructor a su clase y pasar el servicio @doctrine.dbal.%connection_name%_connection service

namespace Acme/TestBundle/Toolbox; use Doctrine/DBAL/Connection; class StringToolbox { /** * * @var Connection */ private $connection; public function __construct(Connection $dbalConnection) { $this->connection = $dbalConnection; } public function lookupSomething($foo) { $sql = "SELECT bar FROM bar_list WHERE foo = :foo"; $stmt = $this->connection->prepare($sql); $stmt->bindValue("foo", $foo); $stmt->execute(); return $bar; } }

La configuración de tu servicio ahora debería verse así:

parameters: my_service_connection: default services: toolbox: class: Acme/TestBundle/Toolbox/StringToolbox arguments: [@doctrine.dbal.%my_service_connection%_connection]

Lo que dices con esta configuración es "hazme un servicio llamado toolbox que recibirá el servicio doctrine.dbal.default_connection como el primer argumento constructor"

Hay otros métodos de inyección además de la inyección de Constructor y debe leer la documentación de http://symfony.com/doc/current/book/service_container.html para obtener una idea de todas las posibilidades (inyección de Setter, inyección de fábrica, etc.) y para mejorar entender cómo funciona la Inyección de Dependencia


@doctrine.dbal.connection no funciona, Como dice Igor, @doctrine.dbal.connection es un resumen, use @doctrine.dbal.default_connection si solo tiene una conexión db, o @doctrine.dbal.%connection_name%_connection donde el %connection_name% placeholder el nombre de la conexión que desea inyectar.

La configuración de tu servicio ahora debería verse así:

services: toolbox: class: Acme/TestBundle/Toolbox/StringToolbox arguments: [@doctrine.dbal.default_connection]