Doctrine和Symfony2:Association指的是不存在错误的反面

时间:2016-01-20 17:39:30

标签: php database symfony doctrine-orm

我有一个页面address.html.twig,用户可以在表UserAddress中添加许多地址。当他在数据库中添加他的地址时,地址应该在他添加地址的同一页面中呈现,然后他可以选择他想要使用的地址。不幸的是,地址不是渲染的。

首先我认为我的控制器操作或我的树枝页面有问题。我甚至在这里问过一个关于它的问题=> here

我在phpmyadmin中验证了所有表格,所有这些都很好的链接,但如果我这样做:php app / console doctrine:schema:validate 我有这个错误:

  

[Mapping] FAIL - 实体类   'FLY \ BookingsBundle \ Entity \ Commandes'映射无效:   * FLY \ BookingsBundle \ Entity \ Commandes#user关联是指反面字段   Application \ Sonata \ UserBundle \ Entity \ User#commandes没有   存在。

     

[Mapping] FAIL - 实体类   'FLY \ BookingsBundle \ Entity \ UserAddress'映射无效:   * FLY \ BookingsBundle \ Entity \ UserAddress#user关联是指反面字段   Application \ Sonata \ UserBundle \ Entity \ User#address没有   存在。

看看这张照片:

enter image description here

这是我的UserAddress.php

/**
 * @ORM\ManyToOne(targetEntity="Application\Sonata\UserBundle\Entity\User", inversedBy="address")
 * @ORM\JoinColumn(nullable=true)
 */
private $user;

Commandes.php

/**
 * @ORM\ManyToOne(targetEntity="Application\Sonata\UserBundle\Entity\User", inversedBy="commandes")
 * @ORM\JoinColumn(nullable=true)
 */
private $user;

user.php的

/**
 * @ORM\Entity(repositoryClass="FLY\UserBundle\Repository\UserRepository")
 * @ORM\Table(name="fos_user_user")
 */
class User extends BaseUser
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */


    protected $id;

    public function __construct()
    {
        parent::__construct();
        $this->commandes = new \Doctrine\Common\Collections\ArrayCollection();
        $this->address = new \Doctrine\Common\Collections\ArrayCollection();
    }


    /**
     * @ORM\OneToMany(targetEntity="FLY\BookingsBundle\Entity\Commandes", mappedBy="user", cascade={"remove"})
     * @ORM\JoinColumn(nullable=true)
     */
    private $commandes;



    /**
     * @ORM\OneToMany(targetEntity="FLY\BookingsBundle\Entity\UserAddress", mappedBy="user", cascade={"remove"})
     * @ORM\JoinColumn(nullable=true)
     */
    private $address;

在这里你可以看到我的var转储:

User {#124 ▼
  #id: 21
  -commandes: null
  -address: null
}

3 个答案:

答案 0 :(得分:0)

这是我的一个应用程序的示例 - 我已经为您的commandes实体做了这个。 您自己可以将此用户地址实体与此示例拼凑起来!

这里是:

user.php的

 /**
 * @ORM\OneToMany(targetEntity="FLY\BookingsBundle\Entity\Commandes", mappedBy="commandesUser")
 */
protected $commandes;

User.php - Getters and Setters

/**
 * Add commandes
 *
 * @param FLY\BookingsBundle\Entity\Commandes $commandes
 */
public function addCommandes(\FLY\BookingsBundle\Entity\Commandes $commandes)
{
    $this->commandes[] = $commandes;
}

/**
 * Get commandes
 *
 * @return Doctrine\Common\Collections\Collection
 */
public function getCommandes()
{
    return $this->commandes;
}

Commandes.php

/**
* @ORM\ManyToOne(targetEntity="Application\Sonata\UserBundle\Entity\User", inversedBy="commandes")
* @ORM\JoinColumn(name="user", referencedColumnName="id")
*/
private $commandesUser;

Commandes.php - Getters and Setters

/**
 * Set commandesUser
 *
 * @param Application\Sonata\UserBundle\Entity\User $commandesUser
 */
public function setCommandesUser(\Application\Sonata\UserBundle\Entity\User $commandesUser = null)
{
    $this->commandesUser = $commandesUser;
}

/**
 * Get $commandesUser
 *
 * @return Application\Sonata\UserBundle\Entity\User
 */
public function getCommandesUser()
{
    return $this->commandesUser;
}

答案 1 :(得分:0)

我有一个问题,在过去几年中出现了2-3次,其中映射不正确但架构更新成功。修复映射后,这并未反映在架构中,symfony认为它已经是最新的。

我建议您尝试从用户,命令和地址表中手动删除相关关系,然后运行:

php app/console doctrine:schema:update --force

- 它可能会解决您的问题。

答案 2 :(得分:0)

其他人很可能不会发生这种情况,但是有机会。

在我的情况下,出现此错误是因为重复。我的实体有2个字段,它们是ManyToOne关系。而且他们都有相同的反向名称,从而导致了此错误。

这是相关的代码位:

class TaskIngredient
{

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Ingredient", inversedBy="taskIngredients")
     * @ORM\JoinColumn(nullable=false)
     */
    private $ingredient;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Task", inversedBy="taskIngredients")
     * @ORM\JoinColumn(nullable=false)
     */
    private $task;
}

解决方案相对容易。我尝试手动更改inversedBy名称。但这并不能解决问题(即使应用了php app/console doctrine:schema:update --force并删除了var/cache文件夹之后)。

所以我只是:

  1. 删除了一个有问题的实体(它是setter / getter)
  2. 运行php bin/console make:entity工具并使用其他名称读取字段
  3. Voilà!问题已解决。