Php 条令2.1.6逆向工程1-n(一对多)关联被误解为1-1(一对一)
我发现Doctrine的逆向工程过程有一个奇怪的行为,只需创建两个简单的表,由一个简单的1-n关系绑定,看看下面SQL代码的快照:Php 条令2.1.6逆向工程1-n(一对多)关联被误解为1-1(一对一),php,sql,orm,doctrine-orm,Php,Sql,Orm,Doctrine Orm,我发现Doctrine的逆向工程过程有一个奇怪的行为,只需创建两个简单的表,由一个简单的1-n关系绑定,看看下面SQL代码的快照: SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0; SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';
DROP SCHEMA IF EXISTS `ACME` ;
CREATE SCHEMA IF NOT EXISTS `ACME` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci ;
USE `ACME` ;
-- -----------------------------------------------------
-- Table `ACME`.`task`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `ACME`.`task` ;
CREATE TABLE IF NOT EXISTS `ACME`.`task` (
`id_task` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
`description` VARCHAR(45) NULL ,
PRIMARY KEY (`id_task`) )
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `ACME`.`tag`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `ACME`.`tag` ;
CREATE TABLE IF NOT EXISTS `ACME`.`tag` (
`id_tag` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
`name` VARCHAR(50) NULL ,
`task_id` INT UNSIGNED NOT NULL ,
PRIMARY KEY (`id_tag`) ,
INDEX `fk_tag_task` (`task_id` ASC) ,
CONSTRAINT `fk_tag_task`
FOREIGN KEY (`task_id` )
REFERENCES `ACME`.`task` (`id_task` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
我有一个Symfony2 netbeans项目
/应用程序/MAMP/htdocs/Acme
从那个位置,根据
在一个航站楼里,我做了:
$ ./../../bin/php/php5.3.6/bin/php app/console doctrine:mapping:convert yml ./src/Acme/TaskBundle/Resources/config/doctrine/ --from-database --force
Processing entity "Tag"
Processing entity "Task"
Exporting "yml" mapping information to "/Applications/MAMP/htdocs/Acme/src/Acme/TaskBundle/Resources/config/doctrine"
$ ./../../bin/php/php5.3.6/bin/php app/console doctrine:mapping:import Acme\TaskBundle yml
Importing mapping information from "default" entity manager
> writing /Applications/MAMP/htdocs/Acme/src/Acme/TaskBundle/Resources/config/doctrine/Tag.orm.yml
> writing /Applications/MAMP/htdocs/Acme/src/Acme/TaskBundle/Resources/config/doctrine/Task.orm.yml
$ ./../../bin/php/php5.3.6/bin/php app/console doctrine:generate:entities Acme\TaskBundle
Generating entities for bundle "AcmeTaskBundle"
> backing up Tag.php to Tag.php~
> generating Acme\TaskBundle\Entity\Tag
> backing up Task.php to Task.php~
> generating Acme\TaskBundle\Entity\Task
事实上,这似乎没什么问题,因为如果你看一下“Tag.orm.yml”:
它创造了一种oneToOne关系,而不是oneToMany
namespace Acme\TaskBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Acme\TaskBundle\Entity\Task
*/
class Task
{
/**
* @var integer $idTask
*/
private $idTask;
/**
* @var string $description
*/
private $description;
/**
* Get idTask
*
* @return integer
*/
public function getIdTask()
{
return $this->idTask;
}
/**
* Set description
*
* @param string $description
*/
public function setDescription($description)
{
$this->description = $description;
}
/**
* Get description
*
* @return string
*/
public function getDescription()
{
return $this->description;
}
}
namespace Acme\TaskBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Acme\TaskBundle\Entity\Tag
*/
class Tag
{
/**
* @var integer $idTag
*/
private $idTag;
/**
* @var string $name
*/
private $name;
/**
* @var Acme\TaskBundle\Entity\Task
*/
private $task;
/**
* Get idTag
*
* @return integer
*/
public function getIdTag()
{
return $this->idTag;
}
/**
* Set name
*
* @param string $name
*/
public function setName($name)
{
$this->name = $name;
}
/**
* Get name
*
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* Set task
*
* @param Acme\TaskBundle\Entity\Task $task
*/
public function setTask(\Acme\TaskBundle\Entity\Task $task)
{
$this->task = $task;
}
/**
* Get task
*
* @return Acme\TaskBundle\Entity\Task
*/
public function getTask()
{
return $this->task;
}
}
如果您需要进一步确认,这里有Task.php和Tag.php:
namespace Acme\TaskBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Acme\TaskBundle\Entity\Task
*/
class Task
{
/**
* @var integer $idTask
*/
private $idTask;
/**
* @var string $description
*/
private $description;
/**
* Get idTask
*
* @return integer
*/
public function getIdTask()
{
return $this->idTask;
}
/**
* Set description
*
* @param string $description
*/
public function setDescription($description)
{
$this->description = $description;
}
/**
* Get description
*
* @return string
*/
public function getDescription()
{
return $this->description;
}
}
namespace Acme\TaskBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Acme\TaskBundle\Entity\Tag
*/
class Tag
{
/**
* @var integer $idTag
*/
private $idTag;
/**
* @var string $name
*/
private $name;
/**
* @var Acme\TaskBundle\Entity\Task
*/
private $task;
/**
* Get idTag
*
* @return integer
*/
public function getIdTag()
{
return $this->idTag;
}
/**
* Set name
*
* @param string $name
*/
public function setName($name)
{
$this->name = $name;
}
/**
* Get name
*
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* Set task
*
* @param Acme\TaskBundle\Entity\Task $task
*/
public function setTask(\Acme\TaskBundle\Entity\Task $task)
{
$this->task = $task;
}
/**
* Get task
*
* @return Acme\TaskBundle\Entity\Task
*/
public function getTask()
{
return $this->task;
}
}
Task.php
namespace Acme\TaskBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Acme\TaskBundle\Entity\Task
*/
class Task
{
/**
* @var integer $idTask
*/
private $idTask;
/**
* @var string $description
*/
private $description;
/**
* Get idTask
*
* @return integer
*/
public function getIdTask()
{
return $this->idTask;
}
/**
* Set description
*
* @param string $description
*/
public function setDescription($description)
{
$this->description = $description;
}
/**
* Get description
*
* @return string
*/
public function getDescription()
{
return $this->description;
}
}
namespace Acme\TaskBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Acme\TaskBundle\Entity\Tag
*/
class Tag
{
/**
* @var integer $idTag
*/
private $idTag;
/**
* @var string $name
*/
private $name;
/**
* @var Acme\TaskBundle\Entity\Task
*/
private $task;
/**
* Get idTag
*
* @return integer
*/
public function getIdTag()
{
return $this->idTag;
}
/**
* Set name
*
* @param string $name
*/
public function setName($name)
{
$this->name = $name;
}
/**
* Get name
*
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* Set task
*
* @param Acme\TaskBundle\Entity\Task $task
*/
public function setTask(\Acme\TaskBundle\Entity\Task $task)
{
$this->task = $task;
}
/**
* Get task
*
* @return Acme\TaskBundle\Entity\Task
*/
public function getTask()
{
return $this->task;
}
}
Tag.php
namespace Acme\TaskBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Acme\TaskBundle\Entity\Task
*/
class Task
{
/**
* @var integer $idTask
*/
private $idTask;
/**
* @var string $description
*/
private $description;
/**
* Get idTask
*
* @return integer
*/
public function getIdTask()
{
return $this->idTask;
}
/**
* Set description
*
* @param string $description
*/
public function setDescription($description)
{
$this->description = $description;
}
/**
* Get description
*
* @return string
*/
public function getDescription()
{
return $this->description;
}
}
namespace Acme\TaskBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Acme\TaskBundle\Entity\Tag
*/
class Tag
{
/**
* @var integer $idTag
*/
private $idTag;
/**
* @var string $name
*/
private $name;
/**
* @var Acme\TaskBundle\Entity\Task
*/
private $task;
/**
* Get idTag
*
* @return integer
*/
public function getIdTag()
{
return $this->idTag;
}
/**
* Set name
*
* @param string $name
*/
public function setName($name)
{
$this->name = $name;
}
/**
* Get name
*
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* Set task
*
* @param Acme\TaskBundle\Entity\Task $task
*/
public function setTask(\Acme\TaskBundle\Entity\Task $task)
{
$this->task = $task;
}
/**
* Get task
*
* @return Acme\TaskBundle\Entity\Task
*/
public function getTask()
{
return $this->task;
}
}
你们也遇到过这个问题吗?提前感谢您我有一个重要的发现:在第一个命令中使用xml而不是yml,这个命令使用的原则是:mapping:convert,它以正确的方式工作 该死的笨虫子
Linuxatico我认为这是一个bug,所以我把它发布在Symfony的问题页面上。有人遇到过这个bug吗?我是唯一一个孤独的可怜人吗?