简体   繁体   中英

symfony doctrine 2 OneToMany - association to the inverse side field error

I want to connect two entities

Dish that is in some DishCategory

Dish (category_id) with DishCategory (id)

There is an error:

The association AppBundle\\Entity\\Dish#categoryId refers to the inverse side field AppBundle\\Entity\\DishCategory#category_id which does not exist.

These are my entity classes

Dish Entity

class Dish
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
     private $id;

    /**
     *@ORM\ManyToOne(targetEntity = "DishCategory",inversedBy="category_id",cascade={"persist"})
     * @ORM\JoinColumn(name="id",referencedColumnName="id")
     */
     private $categoryId;
}

DishCategory Entity


class DishCategory
{

    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     * @ORM\OneToMany(targetEntity="Dish", mappedBy="category_id")
     * @ORM\JoinColumn(name="category_id",referencedColumnName="id")
     */
     private $id;
}

In DishController I run this function to repository

$dishes = $em->getRepository('AppBundle:Dish')->findAllAsArray();

And that how DishRepository looks

public function findAllAsArray()
{
    return $q = $this->createQueryBuilder('d')
        ->join('d.categoryId','c')
        ->select('d.id as id_dish','c.id as id_cat','d.price')
        ->orderBy('c.position', 'asc')
        ->orderBy('d.position', 'asc')
        ->getQuery()
        ->getResult(Query::HYDRATE_ARRAY);
    }

I have read many tutorials about OneToMany but still I cant find where is the problem :(

Still getting error:

The association AppBundle\\Entity\\Dish#categoryId refers to the inverse side field AppBundle\\Entity\\DishCategory#category_id which does not exist.

:(

I guess category_id is a foreign key. Don't map foreign keys to fields in an entit because:

Foreign keys have no meaning whatsoever in an object model. Foreign keys are how a relational database establishes relationships. Your object model establishes relationships through object references. Thus mapping foreign keys to object fields heavily leaks details of the relational model into the object model, something you really should not do.

your DishCategory entity is the Owning side because it holds the foreign key. By the way update your code as below:

Dish entity

class Dish
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
     private $id;


    /**
     * @ORM\ManyToOne(targetEntity="DishCategory", inversedBy="dishes")
     * @ORM\JoinColumn(name="dish_category_id",referencedColumnName="id")
     */
     private $dishCategory;
}

DishCategory entity

class DishCategory
{

    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
     private $id;

     /**
      * @ORM\OneToMany(targetEntity="Dish", mappedBy="dishCategory")
      */
      private $dishes;

     public function __construct()
     {
         $this->dishes = new ArrayCollection();
     }
}

Then in your DishRepository

public function findAllAsArray()
{
    return $q = $this->createQueryBuilder('d')
        ->join('d.category','c')
        ->select('d.id as id_dish','c.id as id_cat','d.price')
        ->addOrderBy('c.position', 'asc')
        ->addOrderBy('d.position', 'asc')
        ->getQuery()
        ->getResult(Query::HYDRATE_ARRAY)
    ;
}

But I don't see the point of doing a double orderBy because multiple calls to orderBy do not stack , use addOrderBy if you want to achieve this. And also Query::HYDRATE_ARRAY is not necessary, I guess, because you will have an array due to the custom query, not and entity.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM