Browse Source

Make the Fixture generation correctly handle composite foreign keys

With MySQL only for the moment
Yves P 10 years ago
parent
commit
23cffae707

+ 10 - 1
src/Database/Schema/MysqlSchema.php

@@ -418,11 +418,20 @@ class MysqlSchema extends BaseSchema
             }
         }
         if ($data['type'] === Table::CONSTRAINT_FOREIGN) {
+            if (!is_array($data['references'][1])) {
+                $data['references'][1] = [$data['references'][1]];
+            }
+
+            $columnsReference = array_map(
+                [$this->_driver, 'quoteIdentifier'],
+                $data['references'][1]
+            );
+
             return $prefix . sprintf(
                 ' FOREIGN KEY (%s) REFERENCES %s (%s) ON UPDATE %s ON DELETE %s',
                 implode(', ', $columns),
                 $this->_driver->quoteIdentifier($data['references'][0]),
-                $this->_driver->quoteIdentifier($data['references'][1]),
+                implode(', ', $columnsReference),
                 $this->_foreignOnClause($data['update']),
                 $this->_foreignOnClause($data['delete'])
             );

+ 45 - 0
tests/Fixture/CustomersFixture.php

@@ -0,0 +1,45 @@
+<?php
+/**
+ * CakePHP(tm) Tests <http://book.cakephp.org/2.0/en/development/testing.html>
+ * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
+ *
+ * Licensed under The MIT License
+ * For full copyright and license information, please see the LICENSE.txt
+ * Redistributions of files must retain the above copyright notice
+ *
+ * @copyright     Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
+ * @link          http://book.cakephp.org/2.0/en/development/testing.html CakePHP(tm) Tests
+ * @since         3.0.7
+ * @license       http://www.opensource.org/licenses/mit-license.php MIT License
+ */
+namespace Cake\Test\Fixture;
+
+use Cake\TestSuite\Fixture\TestFixture;
+
+/**
+ * Class CustomersFixture
+ *
+ */
+class CustomersFixture extends TestFixture
+{
+
+    /**
+     * fields property
+     *
+     * @var array
+     */
+    public $fields = [
+        'id' => ['type' => 'integer', 'null' => false],
+        'fullname' => ['type' => 'string', 'null' => false],
+        '_constraints' => ['primary' => ['type' => 'primary', 'columns' => ['id']]]
+    ];
+
+    /**
+     * records property
+     *
+     * @var array
+     */
+    public $records = [
+        ['fullname' => 'John Doe']
+    ];
+}

+ 75 - 0
tests/Fixture/ProductOrdersFixture.php

@@ -0,0 +1,75 @@
+<?php
+/**
+ * CakePHP(tm) Tests <http://book.cakephp.org/2.0/en/development/testing.html>
+ * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
+ *
+ * Licensed under The MIT License
+ * For full copyright and license information, please see the LICENSE.txt
+ * Redistributions of files must retain the above copyright notice
+ *
+ * @copyright     Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
+ * @link          http://book.cakephp.org/2.0/en/development/testing.html CakePHP(tm) Tests
+ * @since         3.0.7
+ * @license       http://www.opensource.org/licenses/mit-license.php MIT License
+ */
+namespace Cake\Test\Fixture;
+
+use Cake\TestSuite\Fixture\TestFixture;
+
+/**
+ * Class ProductOrdersFixture
+ *
+ */
+class ProductOrdersFixture extends TestFixture
+{
+
+    /**
+     * fields property
+     *
+     * @var array
+     */
+    public $fields = [
+        'id' => ['type' => 'integer'],
+        'product_category' => ['type' => 'integer', 'null' => false],
+        'product_id' => ['type' => 'integer', 'null' => false],
+        'customer_id' => ['type' => 'integer', 'null' => false],
+        '_indexes' => [
+            'product_category' => [
+                'type' => 'index',
+                'columns' => ['product_category', 'product_id']
+            ],
+            'customer_id' => [
+                'type' => 'index',
+                'columns' => ['customer_id']
+            ]
+        ],
+        '_constraints' => [
+            'primary' => [
+                'type' => 'primary', 'columns' => ['id']
+            ],
+            'product_order_ibfk_1' => [
+                'type' => 'foreign',
+                'columns' => ['product_category', 'product_id'],
+                'references' => ['product', ['category', 'id']],
+                'update' => 'cascade',
+                'delete' => 'cascade',
+            ],
+            'product_order_ibfk_2' => [
+                'type' => 'foreign',
+                'columns' => ['customer_id'],
+                'references' => ['customer', 'id'],
+                'update' => 'cascade',
+                'delete' => 'cascade',
+            ]
+        ]
+    ];
+
+    /**
+     * records property
+     *
+     * @var array
+     */
+    public $records = [
+        ['product_category' => 1, 'product_id' => 1, 'customer_id' => 1]
+    ];
+}

+ 49 - 0
tests/Fixture/ProductsFixture.php

@@ -0,0 +1,49 @@
+<?php
+/**
+ * CakePHP(tm) Tests <http://book.cakephp.org/2.0/en/development/testing.html>
+ * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
+ *
+ * Licensed under The MIT License
+ * For full copyright and license information, please see the LICENSE.txt
+ * Redistributions of files must retain the above copyright notice
+ *
+ * @copyright     Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
+ * @link          http://book.cakephp.org/2.0/en/development/testing.html CakePHP(tm) Tests
+ * @since         3.0.7
+ * @license       http://www.opensource.org/licenses/mit-license.php MIT License
+ */
+namespace Cake\Test\Fixture;
+
+use Cake\TestSuite\Fixture\TestFixture;
+
+/**
+ * Class ProductsFixture
+ *
+ */
+class ProductsFixture extends TestFixture
+{
+
+    /**
+     * fields property
+     *
+     * @var array
+     */
+    public $fields = [
+        'id' => ['type' => 'integer'],
+        'category' => ['type' => 'integer', 'null' => false],
+        'name' => ['type' => 'string', 'null' => false],
+        'price' => ['type' => 'integer'],
+        '_constraints' => ['primary' => ['type' => 'primary', 'columns' => ['id', 'category']]]
+    ];
+
+    /**
+     * records property
+     *
+     * @var array
+     */
+    public $records = [
+        ['category' => 1, 'name' => 'First product', 'price' => 10],
+        ['category' => 2, 'name' => 'Second product', 'price' => 20],
+        ['category' => 3, 'name' => 'Third product', 'price' => 30]
+    ];
+}