php - query - symfony2 Catchable Fatal Error: Objeto de clase no se puede convertir a cadena
symfony 3.4 doctrine query (5)
Tengo esta Entidad definida:
<?php
namespace Apw/BlackbullBundle/Entity;
use Doctrine/Common/Collections/ArrayCollection;
use Doctrine/ORM/Mapping as ORM;
/**
* Categories
*
* @ORM/Table()
* @ORM/Entity(repositoryClass="Apw/BlackbullBundle/Entity/CategoriesRepository")
*/
class Categories
{
/**
* @var integer
*
* @ORM/Column(name="id", type="integer")
* @ORM/Id
* @ORM/GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM/Column(name="categories_image", type="string", length=64, nullable = true)
*/
private $categoriesImage;
/**
* @var integer
*
* @ORM/Column(name="parent_id", type="integer", nullable = true, options={"default":0})
*/
private $parentId;
/**
* @var integer
*
* @ORM/Column(name="sort_order", type="integer", nullable = true, options={"default":0})
*/
private $sortOrder;
/**
* @var /DateTime
*
* @ORM/Column(name="date_added", type="datetime", nullable = true)
*/
private $dateAdded;
/**
* @var /DateTime
*
* @ORM/Column(name="last_modified", type="datetime", nullable = true)
*/
private $lastModified;
/**
* @var boolean
*
* @ORM/Column(name="categories_status", type="boolean", nullable = true, options={"default" = 1})
*/
private $categoriesStatus;
/**
* @ORM/OneToMany(targetEntity="CategoriesDescription", mappedBy="category", cascade={"persist", "remove"})
*/
private $categoryDescription;
/**
* @ORM/ManyToMany(targetEntity="Products", mappedBy="categories")
**/
private $products;
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set categoriesImage
*
* @param string $categoriesImage
* @return Categories
*/
public function setCategoriesImage($categoriesImage)
{
$this->categoriesImage = $categoriesImage;
return $this;
}
/**
* Get categoriesImage
*
* @return string
*/
public function getCategoriesImage()
{
return $this->categoriesImage;
}
/**
* Set parentId
*
* @param integer $parentId
* @return Categories
*/
public function setParentId($parentId)
{
$this->parentId = $parentId;
return $this;
}
/**
* Get parentId
*
* @return integer
*/
public function getParentId()
{
return $this->parentId;
}
/**
* Set sortOrder
*
* @param string $sortOrder
* @return Categories
*/
public function setSortOrder($sortOrder)
{
$this->sortOrder = $sortOrder;
return $this;
}
/**
* Get sortOrder
*
* @return string
*/
public function getSortOrder()
{
return $this->sortOrder;
}
/**
* Set dateAdded
*
* @param /DateTime $dateAdded
* @return Categories
*/
public function setDateAdded($dateAdded)
{
$this->dateAdded = $dateAdded;
return $this;
}
/**
* Get dateAdded
*
* @return /DateTime
*/
public function getDateAdded()
{
return $this->dateAdded;
}
/**
* Set lastModified
*
* @param /DateTime $lastModified
* @return Categories
*/
public function setLastModified($lastModified)
{
$this->lastModified = $lastModified;
return $this;
}
/**
* Get lastModified
*
* @return /DateTime
*/
public function getLastModified()
{
return $this->lastModified;
}
/**
* Constructor
*/
public function __construct()
{
$this->categoryDescription = new ArrayCollection();
$this->products = new ArrayCollection();
}
/**
* Add categoryDescription
*
* @param /Apw/BlackbullBundle/Entity/CategoriesDescription $categoryDescription
* @return Categories
*/
public function addCategoryDescription(/Apw/BlackbullBundle/Entity/CategoriesDescription $categoryDescription)
{
$this->categoryDescription[] = $categoryDescription;
return $this;
}
/**
* Remove categoryDescription
*
* @param /Apw/BlackbullBundle/Entity/CategoriesDescription $categoryDescription
*/
public function removeCategoryDescription(/Apw/BlackbullBundle/Entity/CategoriesDescription $categoryDescription)
{
$this->categoryDescription->removeElement($categoryDescription);
}
/**
* Get categoryDescription
*
* @return /Doctrine/Common/Collections/Collection
*/
public function getCategoryDescription()
{
return $this->categoryDescription;
}
/**
* Add products
*
* @param /Apw/BlackbullBundle/Entity/Products $products
* @return Categories
*/
public function addProduct(/Apw/BlackbullBundle/Entity/Products $products)
{
$this->products[] = $products;
return $this;
}
/**
* Remove products
*
* @param /Apw/BlackbullBundle/Entity/Products $products
*/
public function removeProduct(/Apw/BlackbullBundle/Entity/Products $products)
{
$this->products->removeElement($products);
}
/**
* Get products
*
* @return /Doctrine/Common/Collections/Collection
*/
public function getProducts()
{
return $this->products;
}
/**
* Set categoriesStatus
*
* @param boolean $categoriesStatus
* @return Categories
*/
public function setCategoriesStatus($categoriesStatus)
{
$this->categoriesStatus = $categoriesStatus;
return $this;
}
/**
* Get categoriesStatus
*
* @return boolean
*/
public function getCategoriesStatus()
{
return $this->categoriesStatus;
}
}
Luego tengo este método en mi controlador para manejar el envío del formulario:
<?php
namespace Apw/BlackbullBundle/Controller;
use Apw/BlackbullBundle/Entity/Categories;
use Apw/BlackbullBundle/Entity/CategoriesDescription;
use Apw/BlackbullBundle/Form/CategoriesType;
use Symfony/Bundle/FrameworkBundle/Controller/Controller;
use Sensio/Bundle/FrameworkExtraBundle/Configuration/Route;
use Sensio/Bundle/FrameworkExtraBundle/Configuration/Template;
use Symfony/Component/HttpFoundation/JsonResponse;
use Symfony/Component/HttpFoundation/Request;
use Symfony/Component/Form/Extension/Core/ChoiceList/ChoiceList;
use Sensio/Bundle/FrameworkExtraBundle/Configuration/Security;
class CategoriesController extends Controller
{
/**
* @Security("has_role(''ROLE_ADMIN'')")
* @Route("/createCategory")
* @Template()
*/
public function createCategoryAction(Request $request){
$category = new Categories();
$categoryDesc = new CategoriesDescription();
$category->addCategoryDescription($categoryDesc);
$categoryDesc->setCategory($category);
$form = $this->createForm(new CategoriesType(), $category);
$form->handleRequest($request);
if($form->isValid()){
//exit(/Doctrine/Common/Util/Debug::dump($category));
$em = $this->getDoctrine()->getManager();
$em->persist($category);
$em->persist($categoryDesc);
$em->flush();
return $this->redirect($this->generateUrl(''apw_blackbull_categories_showcategories''));
}
return array(
''form'' => $form->createView()
);
}
}
Y finalmente este es mi CategoryType.php:
<?php
namespace Apw/BlackbullBundle/Form;
use Doctrine/ORM/EntityRepository;
use Symfony/Component/Form/AbstractType;
use Symfony/Component/Form/FormBuilderInterface;
use Symfony/Component/OptionsResolver/OptionsResolverInterface;
class CategoriesType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add(''categoryDescription'', ''collection'',
array(
''type'' => new CategoriesDescriptionType(),
''allow_add'' => true,
''options'' => array(''data_class'' => ''Apw/BlackbullBundle/Entity/CategoriesDescription''),
''by_reference'' => false,
))
->add(''categoriesImage'', null, array(''label''=>''Foto:''))
->add(''categoriesStatus'', null, array(''label''=>''Stato:''))
->add(''parentId'', ''entity'', array( //provare a mettere una querybuiler
''class'' => ''ApwBlackbullBundle:CategoriesDescription'',
''property'' => ''categoriesName'',
''empty_value'' => ''Scegliere una categoria'',
''required'' => false,
''label'' => ''Crea in:''))
->add(''salva'',''submit'')
->add(''azzera'',''reset'')
;
}
/**
* @param OptionsResolverInterface $resolver
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
''data_class'' => ''Apw/BlackbullBundle/Entity/Categories'',
));
}
/**
* @return string
*/
public function getName()
{
return ''categories'';
}
}
Cuando intento guardar datos obtengo este error:
Se produjo una excepción al ejecutar ''INSERT INTO Categories (categories_image, parent_id, sort_order, date_added, last_modified, categories_status) VALUES (?,?,?,?,?,?)'' Con params ["as", {}, null, null , nulo, 1]:
Fatal Error acumulable: el objeto de la clase Apw / BlackbullBundle / Entity / CategoriesDescription no se pudo convertir a cadena
¿Qué estoy haciendo mal?
Necesita implementar el método __toString()
en su Apw/BlackbullBundle/Entity/CategoriesDescription
.
Podrías hacerlo:
public function __toString() {
return $this->name;
}
Obtuve el mismo error pero lo modifiqué un poco al agregar:
public function __toString() {
return (string) $this->name; }
Estoy seguro de que estaba obteniendo nulo en lugar de un valor de cadena. (Estaba trabajando con el proyecto sonata).
También puede usar el acceso a la propiedad en su formulario:
->add(''categoryDescription'', ''collection'',
array(
''type'' => new CategoriesDescriptionType(),
''allow_add'' => true,
''options'' => array(''data_class'' => ''Apw/BlackbullBundle/Entity/CategoriesDescription''),
''by_reference'' => false,
))
Y agregue ''property'' => ''name''
en su CategoriesDescriptionType.
Por cierto, la respuesta @CoachNono también está bien.
así que resolví el problema obteniendo el valor de parent relativo en el método $form->isValid()
public function createCategoryAction(Request $request){
$category = new Categories();
$categoryDesc = new CategoriesDescription();
$category->addCategoryDescription($categoryDesc);
$categoryDesc->setCategory($category);
$form = $this->createForm(new CategoriesType(), $category);
$form->handleRequest($request);
if($form->isValid()){
//exit(/Doctrine/Common/Util/Debug::dump($parentCategory->getId()));
$em = $this->getDoctrine()->getManager();
if(!$category->getParentId()){
$category->setParentId(0);
}else{
// get parent id value from input choice
$parent = $category->getParentId();
$parentCategory = $parent->getCategory();
// end
$category->setParentId($parentCategory->getId());
}
$em->persist($category);
$em->persist($categoryDesc);
$em->flush();
return $this->redirect($this->generateUrl(''apw_blackbull_categories_showcategories''));
}
return array(
''form'' => $form->createView()
);
}
¡Gracias!
Para Symfony 3.x
De acuerdo con Symfony docs v3.x , debe usar la propiedad choice_label para especificar el nombre del campo de la entidad que se usará aquí.
->add(''categoryDescription'', ''collection'',
array(
''type'' => new CategoriesDescriptionType(),
''allow_add'' => true,
''options'' => array(''data_class'' => ''Apw/BlackbullBundle/Entity/CategoriesDescription''),
''choice_label'' => ''name'',
''by_reference'' => false,
))