Skip to content

Commit

Permalink
Make the Fixture generation correctly handle composite foreign keys
Browse files Browse the repository at this point in the history
With MySQL only for the moment
  • Loading branch information
HavokInspiration committed Jun 17, 2015
1 parent 7bb51c4 commit 23cffae
Show file tree
Hide file tree
Showing 4 changed files with 179 additions and 1 deletion.
11 changes: 10 additions & 1 deletion src/Database/Schema/MysqlSchema.php
Expand Up @@ -418,11 +418,20 @@ protected function _keySql($prefix, $data)
}
}
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'])
);
Expand Down
45 changes: 45 additions & 0 deletions 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 changes: 75 additions & 0 deletions 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 changes: 49 additions & 0 deletions 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]
];
}

0 comments on commit 23cffae

Please sign in to comment.