Doctrine orm 在原则2.4和CodeIgniter 2.2的多对多关系中,数据未插入到第三个表中
这个问题在stackoverflow上被问了很多次,但都没有帮到我 我有三张桌子:Doctrine orm 在原则2.4和CodeIgniter 2.2的多对多关系中,数据未插入到第三个表中,doctrine-orm,codeigniter-2,Doctrine Orm,Codeigniter 2,这个问题在stackoverflow上被问了很多次,但都没有帮到我 我有三张桌子: 学生 主题 学生科目 问题:当我尝试插入数据时,行被插入到student和subject表中,而不是插入到student\u subject表中 有关环境的详细信息: 编码中心2.2 原则2.4 Xampp PHP 5.5.15 Apache 2.4.4 mysql 5.0.11 Windows 8.1 x64 pro 有关数据库架构的详细信息:我的表结构是: 学生科目表格: mysql> des
学生
主题
学生科目
student
和subject
表中,而不是插入到student\u subject
表中
有关环境的详细信息:
- 编码中心2.2
- 原则2.4
- Xampp
- PHP 5.5.15
- Apache 2.4.4
- mysql 5.0.11
- Windows 8.1 x64 pro
表格:学生科目
mysql> desc student_subject; +------------+---------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+---------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | student_id | int(11) | YES | MUL | NULL | | | subject_id | int(11) | YES | MUL | NULL | | +------------+---------+------+-----+---------+----------------+ 3 rows in set (0.00 sec)
mysql> desc student; +-------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(255) | YES | | NULL | | | class | char(1) | YES | | NULL | | +-------+--------------+------+-----+---------+----------------+ 3 rows in set (0.00 sec)
mysql> desc subject; +--------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(255) | YES | | NULL | | | author | varchar(255) | YES | | NULL | | +--------+--------------+------+-----+---------+----------------+ 3 rows in set (0.00 sec)
表格:主题
mysql> desc student_subject; +------------+---------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+---------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | student_id | int(11) | YES | MUL | NULL | | | subject_id | int(11) | YES | MUL | NULL | | +------------+---------+------+-----+---------+----------------+ 3 rows in set (0.00 sec)
mysql> desc student; +-------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(255) | YES | | NULL | | | class | char(1) | YES | | NULL | | +-------+--------------+------+-----+---------+----------------+ 3 rows in set (0.00 sec)
mysql> desc subject; +--------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(255) | YES | | NULL | | | author | varchar(255) | YES | | NULL | | +--------+--------------+------+-----+---------+----------------+ 3 rows in set (0.00 sec)
表格:主题
mysql> desc student_subject; +------------+---------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+---------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | student_id | int(11) | YES | MUL | NULL | | | subject_id | int(11) | YES | MUL | NULL | | +------------+---------+------+-----+---------+----------------+ 3 rows in set (0.00 sec)
mysql> desc student; +-------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(255) | YES | | NULL | | | class | char(1) | YES | | NULL | | +-------+--------------+------+-----+---------+----------------+ 3 rows in set (0.00 sec)
mysql> desc subject; +--------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(255) | YES | | NULL | | | author | varchar(255) | YES | | NULL | | +--------+--------------+------+-----+---------+----------------+ 3 rows in set (0.00 sec)
:C:\xampp\htdocs\test\u orm\application\libraries\doctor.php
<?php use Doctrine\Common\ClassLoader, Doctrine\ORM\Configuration, Doctrine\ORM\EntityManager, Doctrine\Common\Cache\ArrayCache, Doctrine\DBAL\Logging\EchoSQLLogger, Doctrine\ORM\Mapping\Driver\DatabaseDriver, Doctrine\ORM\Tools\DisconnectedClassMetadataFactory, Doctrine\ORM\Tools\EntityGenerator; /** * CodeIgniter Smarty Class * * initializes basic doctrine settings and act as doctrine object * * @final Doctrine * @category Libraries */ class Doctrine { /** * @var EntityManager $em */ public $em = null; /** * constructor */ public function __construct() { // load database configuration from CodeIgniter require APPPATH.'config/database.php'; // Set up class loading. You could use different autoloaders, provided by your favorite framework, // if you want to. require_once APPPATH.'third_party/Doctrine/Common/ClassLoader.php'; $doctrineClassLoader = new ClassLoader('Doctrine', APPPATH.'third_party'); $doctrineClassLoader->register(); $entitiesClassLoader = new ClassLoader('models', rtrim(APPPATH, "/" )); $entitiesClassLoader->register(); $proxiesClassLoader = new ClassLoader('proxies', APPPATH.'models'); $proxiesClassLoader->register(); // Set up caches $config = new Configuration; $cache = new ArrayCache; $config->setMetadataCacheImpl($cache); $driverImpl = $config->newDefaultAnnotationDriver(array(APPPATH.'models/Entities')); $config->setMetadataDriverImpl($driverImpl); $config->setQueryCacheImpl($cache); // Proxy configuration $config->setProxyDir(APPPATH.'models/proxies'); $config->setProxyNamespace('Proxies'); // Set up logger //$logger = new EchoSQLLogger; //$config->setSQLLogger($logger); $config->setAutoGenerateProxyClasses( TRUE ); // Database connection information $connectionOptions = array( 'driver' => 'pdo_mysql', 'user' => $db['default']['username'], 'password' => $db['default']['password'], 'host' => $db['default']['hostname'], 'dbname' => $db['default']['database'] ); // Create EntityManager $this->em = EntityManager::create($connectionOptions, $config); $this->em->getConfiguration() ->setMetadataDriverImpl( new DatabaseDriver( $this->em->getConnection()->getSchemaManager() ) ); //$this->generate_classes(); } /** * generate entity objects automatically from mysql db tables * @return none */ function generate_classes(){ $cmf = new DisconnectedClassMetadataFactory(); $cmf->setEntityManager($this->em); $metadata = $cmf->getAllMetadata(); $generator = new EntityGenerator(); $generator->setUpdateEntityIfExists(true); $generator->setGenerateStubMethods(true); $generator->setGenerateAnnotations(true); $generator->generate($metadata, APPPATH."models/Entities"); } }
C:\xampp\htdocs\test\u orm\application\models\Entities\Student.php
<?php use Doctrine\ORM\Mapping as ORM; use Doctrine\Common\Collections\ArrayCollection; /** * Subject * * @ORM\Table(name="subject") * @ORM\Entity */ class Subject { public function __construct() { $this->students = new ArrayCollection(); } /** * @var integer * * @ORM\Column(name="id", type="integer", nullable=false) * @ORM\Id * @ORM\GeneratedValue(strategy="IDENTITY") */ private $id; /** * @var string * * @ORM\Column(name="name", type="string", length=255, nullable=true) */ private $name; /** * @var string * * @ORM\Column(name="author", type="string", length=255, nullable=true) */ private $author; /** * @ORM\ManyToMany(targetEntity="Student" mappedBy="subjects") */ protected $students; /** * Get id * * @return integer */ public function getId() { return $this->id; } /** * Set name * * @param string $name * @return Subject */ public function setName($name) { $this->name = $name; return $this; } /** * Get name * * @return string */ public function getName() { return $this->name; } /** * Set author * * @param string $author * @return Subject */ public function setAuthor($author) { $this->author = $author; return $this; } /** * Get author * * @return string */ public function getAuthor() { return $this->author; } /** * Add the Student to Subject * * @param Student $student * @return void */ public function addStudent(Student $student){ $student->addSubject($this); $this->students[] =$student; } public function getStudents () { return $this->students; } }
<?php use Doctrine\ORM\Mapping as ORM; use Doctrine\Common\Collections\ArrayCollection; /** * Student * * @ORM\Table(name="student") * @ORM\Entity */ class Student { public function __construct() { $this->subjects = new ArrayCollection(); } /** * @var integer * * @ORM\Column(name="id", type="integer", nullable=false) * @ORM\Id * @ORM\GeneratedValue(strategy="IDENTITY") */ private $id; /** * @var string * * @ORM\Column(name="name", type="string", length=255, nullable=true) */ private $name; /** * @var string * * @ORM\Column(name="class", type="string", length=1, nullable=true) */ private $class; /** * @ORM\ManyToMany(targetEntity="Subject", inversedBy="students") * @ORM\JoinTable(name="student_subject") */ protected $subjects; /** * Get id * * @return integer */ public function getId() { return $this->id; } /** * Set name * * @param string $name * @return Student */ public function setName($name) { $this->name = $name; return $this; } /** * Get name * * @return string */ public function getName() { return $this->name; } /** * Set class * * @param string $class * @return Student */ public function setClass($class) { $this->class = $class; return $this; } /** * Get class * * @return string */ public function getClass() { return $this->class; } /** * Add the Subject to Student * * @param Subject $subject * @return void */ public function addSubject(Subject $subject){ //$subject->addStudent($this); $this->subjects[] = $subject; } public function getSubjects () { return $this->subjects; } }
<?php require_once(APPPATH."models/Entities/Student.php"); require_once(APPPATH."models/Entities/Subject.php"); //use Doctrine\ORM\EntityManager; use \Student; use \Subject; class StudentModel extends CI_Model { /** * @var \Doctrine\ORM\EntityManager $em */ var $em; public function __construct() { parent::__construct(); $this->em = $this->doctrine->em; } /** * Add contact messages to database * @param array $contact_form * @return bool */ public function addSubject() { /** * @var Student $student */ $student = new Student(); $student->setName("Musa Haidari"); $student->setClass("BCS"); $subject = new Subject(); $subject->setName("JAVA"); $subject->setAuthor("XXX"); $this->em->persist($subject); $subject = new Subject(); $subject->setName("PHP"); $subject->setAuthor("YYY"); $this->em->persist($subject); $student->addSubject($subject); $this->em->persist($student); try { //save to database $this->em->flush(); } catch(Exception $err){ die($err->getMessage()); } return true; } }
C:\xampp\htdocs\test\u orm\application\controllers\Landing.php
<?php use Doctrine\ORM\Mapping as ORM; use Doctrine\Common\Collections\ArrayCollection; /** * Subject * * @ORM\Table(name="subject") * @ORM\Entity */ class Subject { public function __construct() { $this->students = new ArrayCollection(); } /** * @var integer * * @ORM\Column(name="id", type="integer", nullable=false) * @ORM\Id * @ORM\GeneratedValue(strategy="IDENTITY") */ private $id; /** * @var string * * @ORM\Column(name="name", type="string", length=255, nullable=true) */ private $name; /** * @var string * * @ORM\Column(name="author", type="string", length=255, nullable=true) */ private $author; /** * @ORM\ManyToMany(targetEntity="Student" mappedBy="subjects") */ protected $students; /** * Get id * * @return integer */ public function getId() { return $this->id; } /** * Set name * * @param string $name * @return Subject */ public function setName($name) { $this->name = $name; return $this; } /** * Get name * * @return string */ public function getName() { return $this->name; } /** * Set author * * @param string $author * @return Subject */ public function setAuthor($author) { $this->author = $author; return $this; } /** * Get author * * @return string */ public function getAuthor() { return $this->author; } /** * Add the Student to Subject * * @param Student $student * @return void */ public function addStudent(Student $student){ $student->addSubject($this); $this->students[] =$student; } public function getStudents () { return $this->students; } }
<?php use Doctrine\ORM\Mapping as ORM; use Doctrine\Common\Collections\ArrayCollection; /** * Student * * @ORM\Table(name="student") * @ORM\Entity */ class Student { public function __construct() { $this->subjects = new ArrayCollection(); } /** * @var integer * * @ORM\Column(name="id", type="integer", nullable=false) * @ORM\Id * @ORM\GeneratedValue(strategy="IDENTITY") */ private $id; /** * @var string * * @ORM\Column(name="name", type="string", length=255, nullable=true) */ private $name; /** * @var string * * @ORM\Column(name="class", type="string", length=1, nullable=true) */ private $class; /** * @ORM\ManyToMany(targetEntity="Subject", inversedBy="students") * @ORM\JoinTable(name="student_subject") */ protected $subjects; /** * Get id * * @return integer */ public function getId() { return $this->id; } /** * Set name * * @param string $name * @return Student */ public function setName($name) { $this->name = $name; return $this; } /** * Get name * * @return string */ public function getName() { return $this->name; } /** * Set class * * @param string $class * @return Student */ public function setClass($class) { $this->class = $class; return $this; } /** * Get class * * @return string */ public function getClass() { return $this->class; } /** * Add the Subject to Student * * @param Subject $subject * @return void */ public function addSubject(Subject $subject){ //$subject->addStudent($this); $this->subjects[] = $subject; } public function getSubjects () { return $this->subjects; } }
类着陆扩展CI_控制器{<?php require_once(APPPATH."models/Entities/Student.php"); require_once(APPPATH."models/Entities/Subject.php"); //use Doctrine\ORM\EntityManager; use \Student; use \Subject; class StudentModel extends CI_Model { /** * @var \Doctrine\ORM\EntityManager $em */ var $em; public function __construct() { parent::__construct(); $this->em = $this->doctrine->em; } /** * Add contact messages to database * @param array $contact_form * @return bool */ public function addSubject() { /** * @var Student $student */ $student = new Student(); $student->setName("Musa Haidari"); $student->setClass("BCS"); $subject = new Subject(); $subject->setName("JAVA"); $subject->setAuthor("XXX"); $this->em->persist($subject); $subject = new Subject(); $subject->setName("PHP"); $subject->setAuthor("YYY"); $this->em->persist($subject); $student->addSubject($subject); $this->em->persist($student); try { //save to database $this->em->flush(); } catch(Exception $err){ die($err->getMessage()); } return true; } }
public function index() { $this->load->view('welcome_message'); } public function addStudentSubjectLog () { $this->load->model('StudentModel'); $this->StudentModel->addSubject(); echo "<br /><br />Done!<br /><br />"; }
}公共功能索引() { $this->load->view('welcome_message'); } 公共函数addStudentSubjectLog(){ $this->load->model('StudentModel'); $this->StudentModel->addSubject(); 回声“
完成!
”; }
http://localhost/test_orm/Landing/addStudentSubjectLog
我认为您应该取消注释行/$subject->addStudent($this)代码>来自学生
实体的添加主题
功能
另外,删除行$student->addSubject($this)代码>从addStudent
功能中选择Subject
实体
我认为在将$subject
添加到对象之前,还应该保留$student
对象。基本上切换这两条线路:
$student->addSubject($subject);
$this->em->persist($student);
希望这有帮助。您没有将第二个$subject
持久化到addSubject()
@andy感谢您的关注,但是,我也尝试过,但没有成功。手动添加向后引用。可能值得一试。是否验证了映射和架构vendor/bin/doctor orm:validate schema
虽然我不认为这是问题的根源,但联接表应该只包含两列(外键),它们一起构成一个复合主键。查看供应商/bin/orm:schema工具:create--dump sql
的输出。