使用Phinx添加外键

时间:2017-01-24 22:27:12

标签: php mysql phinx

我知道有一些类似于这个的帖子,但他们没有给我我需要的答案。所以,我正在使用Phinx而我正在尝试添加外键,但是我收到以下错误:

<?php

use Phinx\Migration\AbstractMigration;

class CustomQuotes extends AbstractMigration
{
    /**
     * Change Method.
     *
     * Write your reversible migrations using this method.
     *
     * More information on writing migrations is available here:
     * http://docs.phinx.org/en/latest/migrations.html#the-abstractmigration-class
     *
     * The following commands can be used in this method and Phinx will
     * automatically reverse them when rolling back:
     *
     *    createTable
     *    renameTable
     *    addColumn
     *    renameColumn
     *    addIndex
     *    addForeignKey
     *
     * Remember to call "create()" or "update()" and NOT "save()" when working
     * with the Table class.
     */
    public function change()
    {
        $table = $this->table('custom_quotes', ['id' => false, 'primary_key' => ['custom_quote_id']]);
        $table->addColumn('custom_quote_id', 'biginteger', ['identity' =>true, 'signed' => false])
        ->addColumn('account_id', 'biginteger', ['limit' => 20, 'null' => true])
        ->addColumn('quote_type_id', 'integer', ['limit' => 11, 'null' => true])
        ->addColumn('quote', 'string', ['limit' => 500, 'null' => true])
        ->addColumn('selected', 'integer', ['limit' => 4, 'null' => true, 'default' => 1])
        ->addForeignKey('account_id', 'accounts', 'account_id', array('delete'=> 'NO_ACTION', 'update'=> 'NO_ACTION'))
        ->addForeignKey('quote_type_id', 'quote_types', 'quote_type_id', array('delete'=> 'NO_ACTION', 'update'=> 'NO_ACTION'))
        ->create();
    }
}

这是带有外键的php文件:

use Phinx\Migration\AbstractMigration;

class CustomQuotes extends AbstractMigration
{
    /**
     * Change Method.
     *
     * Write your reversible migrations using this method.
     *
     * More information on writing migrations is available here:
     * http://docs.phinx.org/en/latest/migrations.html#the-abstractmigration-class
     *
     * The following commands can be used in this method and Phinx will
     * automatically reverse them when rolling back:
     *
     *    createTable
     *    renameTable
     *    addColumn
     *    renameColumn
     *    addIndex
     *    addForeignKey
     *
     * Remember to call "create()" or "update()" and NOT "save()" when working
     * with the Table class.
     */
    public function change()
    {
        $table = $this->table('custom_quotes', ['id' => false, 'primary_key' => ['custom_quote_id']]);
        $table->addColumn('custom_quote_id', 'biginteger', ['identity' =>true, 'signed' => false])
        ->addColumn('account_id', 'biginteger', ['limit' => 20, 'null' => true])
        ->addColumn('quote_type_id', 'integer', ['limit' => 11, 'null' => true])
        ->addColumn('quote', 'string', ['limit' => 500, 'null' => true])
        ->addColumn('selected', 'integer', ['limit' => 4, 'null' => true, 'default' => 1])
        ->addForeignKey('account_id', 'accounts', 'account_id', array('delete'=> 'NO_ACTION', 'update'=> 'NO_ACTION'))
        ->addForeignKey('quote_type_id', 'quote_types', 'quote_type_id', array('delete'=> 'NO_ACTION', 'update'=> 'NO_ACTION'))
        ->create();
    }
}

我试图获取id的两个表是在上表之前创建的。以下是其他两个表格:

引用类型表     

<?php

use Phinx\Migration\AbstractMigration;

class MakeAccountsTable extends AbstractMigration
{
    /**
     * Change Method.
     *
     * Write your reversible migrations using this method.
     *
     * More information on writing migrations is available here:
     * http://docs.phinx.org/en/latest/migrations.html#the-abstractmigration-class
     *
     * The following commands can be used in this method and Phinx will
     * automatically reverse them when rolling back:
     *
     *    createTable
     *    renameTable
     *    addColumn
     *    renameColumn
     *    addIndex
     *    addForeignKey
     *
     * Remember to call "create()" or "update()" and NOT "save()" when working
     * with the Table class.
     */
    public function change()
    {
        $table = $this->table('accounts', ['id' => false, 'primary_key' => ['account_id']]);
        $table->addColumn('account_id', 'biginteger', ['identity' =>true, 'signed' => false])
        ->addColumn('css_user_guid', 'string', ['limit' => 40])
        ->addColumn('state_id', 'integer', ['limit' => 11, 'null' => true])
        ->addColumn('phone', 'string', ['limit' => 45, 'null' => true])
        ->addColumn('street', 'string', ['limit' => 45, 'null' => true])
        ->addColumn('city', 'string', ['limit' => 45, 'null' => true])
        ->addColumn('zip', 'string', ['limit' => 45, 'null' => true])
        ->addColumn('state', 'string', ['limit' => 45, 'null' => true])
        ->addColumn('terms_of_service_accepted', 'boolean', ['limit' => 1, 'null' => true, 'default' => 0])
        ->addColumn('quote', 'string', ['limit' => 300, 'null' => true])
        ->addColumn('date_created', 'datetime', ['null' => true])
        ->create();
    }
}

帐户表

#include "tinyexpr.h"
#include <stdio.h>

int main(int argc, char *argv[])
{
    printf("%f\n", te_interp("5 * 5", 0)); //Prints 25
    return 0;
}

1 个答案:

答案 0 :(得分:3)

所以我明白了。事实证明我必须在custom_quotes表中使我的account_id和quote_type_id无符号,因为我在accounts和quote_type表中使它们无符号。现在有道理。这是解决方案:

<?php

use Phinx\Migration\AbstractMigration;

class CustomQuotes extends AbstractMigration
{
    /**
     * Change Method.
     *
     * Write your reversible migrations using this method.
     *
     * More information on writing migrations is available here:
     * http://docs.phinx.org/en/latest/migrations.html#the-abstractmigration-class
     *
     * The following commands can be used in this method and Phinx will
     * automatically reverse them when rolling back:
     *
     *    createTable
     *    renameTable
     *    addColumn
     *    renameColumn
     *    addIndex
     *    addForeignKey
     *
     * Remember to call "create()" or "update()" and NOT "save()" when working
     * with the Table class.
     */
    public function change()
    {
        $table = $this->table('custom_quotes', ['id' => false, 'primary_key' => ['custom_quote_id']]);
        $table->addColumn('custom_quote_id', 'biginteger', ['identity' =>true, 'signed' => false])
        ->addColumn('account_id', 'biginteger', ['limit' => 20, 'null' => true, "signed" => false])
        ->addColumn('quote_type_id', 'integer', ['limit' => 11, 'null' => true, "signed" => false])
        ->addColumn('quote', 'string', ['limit' => 500, 'null' => true])
        ->addColumn('selected', 'integer', ['limit' => 4, 'null' => true, 'default' => 1])
        ->addForeignKey('account_id', 'accounts', 'account_id', array('delete'=> 'NO_ACTION', 'update'=> 'NO_ACTION'))
        ->addForeignKey('quote_type_id', 'quote_types', 'quote_type_id', array('delete'=> 'NO_ACTION', 'update'=> 'NO_ACTION'))
        ->create();
    }
}