Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Doctrine orm 在原则2.4和CodeIgniter 2.2的多对多关系中,数据未插入到第三个表中_Doctrine Orm_Codeigniter 2 - Fatal编程技术网

Doctrine orm 在原则2.4和CodeIgniter 2.2的多对多关系中,数据未插入到第三个表中

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

这个问题在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> 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)
    
PHP(CodeIgniter)代码的详细信息:

  • 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;
          }
      }
      
      <?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;       
          }
      }
      
      类着陆扩展CI_控制器{

      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();
      回声“

      完成!

      ”; }
      }

要插入数据,我在浏览器中输入以下URL:


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
的输出。