use*_*791 23 doctrine-orm zend-framework2
我在zend框架2中使用doctrine 2.下面是我的实体文件.问题是,当我尝试使用时验证模式,
./vendor/bin/doctrine-module orm:validate-schema
Run Code Online (Sandbox Code Playgroud)
命令.
我收到了错误,
[Doctrine\DBAL\Schema\SchemaException]
The table with name 'database.opportunitycriteria' already exists.
Run Code Online (Sandbox Code Playgroud)
我该怎么办?
namespace Administration\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* OpportunityCriteria
*
* @ORM\Table(name="OpportunityCriteria")
* @ORM\Entity
*/
class Criteria
{
/**
* @var integer
* @ORM\Id
* @ORM\Column(name="criteria_id", type="integer", nullable=false)
*/
private $criteria_id;
/**
* @var string
*
* @ORM\Column(name="description", type="string", nullable=false)
*/
private $description;
}
Run Code Online (Sandbox Code Playgroud)
和适当的getter和setter方法..
Ben*_*min 15
我终于弄明白了.OP的用例可能不同,但就我而言,这是因为双向多对多关系配置错误.
我有以下实体:
class Cuisine {
/**
* @ManyToMany(targetEntity="Dish")
* @ORM\JoinTable(name="CuisineDish", ...)
*/
protected $dishes;
}
class Dish {
/**
* @ORM\ManyToMany(targetEntity="Cuisine")
* @ORM\JoinTable(name="CuisineDish", ...)
*/
protected $cuisines;
}
Run Code Online (Sandbox Code Playgroud)
缺少的是注释的属性inversedBy和mappedBy属性@ManyToMany.这些仅在关联是双向的时才需要.
所以现在正确映射的实体看起来像:
class Cuisine {
/**
* @ManyToMany(targetEntity="Dish", inversedBy="cuisines")
* @ORM\JoinTable(name="CuisineDish", )
*/
protected $dishes;
}
class Dish {
/**
* @ORM\ManyToMany(targetEntity="Cuisine", mappedBy="dishes")
* @ORM\JoinTable(name="CuisineDish", ...)
*/
protected $cuisines;
}
Run Code Online (Sandbox Code Playgroud)
并且orm:validate-schema不再以异常退出.
异常消息只是误导,因为此操作不会更改数据库.此外,只有在验证与数据库的同步时才会发现此问题,而不是仅在验证映射only(--skip-sync)时应该这样做.
我刚刚报告了这个错误.
| 归档时间: |
|
| 查看次数: |
7904 次 |
| 最近记录: |