Laravel模式构建器主键作为外键

时间:2017-01-06 10:58:58

标签: php mysql laravel laravel-4

我使用Laravel 4.2架构构建器来创建一些彼此引用的表,并且遇到了一些问题。

我有一个简化的ERD。请注意,仅显示相关列:

ERD

请注意,我无法以任何方式修改tblcurrenciestbldomains表,因为我正在开发一个模块以挂钩到现有系统。

我正在努力实现以下目标:

  1. extensions表包含有关tbldomains
  2. 中行的额外信息
  3. prices表包含有关某种货币的域名的定价信息,以及其他类型值(注册,续订,转让)
  4. 我想使用外键,以便我可以级联删除。
  5. 目前,我使用以下代码创建两个表:

    Capsule::schema()->create('extensions', function ($table) {
        $table->engine = 'InnoDB';
        $table->integer('relid', 10);
        // ...
        $table->primary(['relid']);
        $table->foreign('relid')->references('id')->on('tbldomains')->onDelete('cascade');
    });
    
    Capsule::schema()->create('prices', function ($table) {
        $table->engine = 'InnoDB';
        $table->integer('relid', 10);
        $table->integer('currency', 10);
        $table->enum('type', ['domainregister', 'domainrenew', 'domaintransfer']);
        // ...
        $table->primary(['relid', 'currency', 'type']);
        $table->foreign('relid')->references('relid')->on('extensions')->onDelete('cascade');
        $table->foreign('currency')->references('id')->on('tblcurrencies')->onDelete('cascade');
    });
    

    prices表的创建脚本会产生以下SQL查询:

    create table `prices` (`relid` int unsigned null auto_increment primary key, `currency` int unsigned null auto_increment primary key, `type` enum('domainregister', 'domainrenew', 'domaintransfer') not null, ...) engine = InnoDB
    

    反过来会导致以下错误:

      

    SQLSTATE [42000]:语法错误或访问冲突:1075表定义不正确;只能有一个自动列,必须将其定义为键

    我也尝试将主键设置为唯一,确定Laravel可能会自动将主要整数键设置为自动增量。

    此外,我尝试按照thisthis回答

    的建议将列设置为unsignedindex

    如何停止架构构建器将relidcurrency字段设置为自动递增,因为它们只是外键?

1 个答案:

答案 0 :(得分:0)

基于以下链接上的Laravel文档Api,只有string()方法可以具有length属性。 Laravel Documentation Api

因此,要使这两列unsigned而非primary keyauto increment进行以下更改:

来自:

$table->integer('relid', 10);
$table->integer('currency', 10);

到此:

$table->integer('relid', false, true);
$table->integer('currency', false, true);

因为根据文档,integer()方法语法是:

integer(string $column, bool $autoIncrement = false, bool $unsigned = false)

你所做的是你为一个布尔变量($ autoIncrement)赋值(10),在这种情况下它总是返回true。有关此问题的进一步证明,请参阅php.net的以下链接。 php.net Boolean

之前我遇到过同样的问题,当我开始回顾Laravel文档时,90%的混淆将被清除。希望这会对你有所帮助。

注意:你也可以使用unsignedInteger()方法,我认为它更明确,更容易记住:

unsignedInteger(string $column, bool $autoIncrement = false)

所以代码就是这样:

$table->unsignedInteger('relid');
$table->unsignedInteger('currency');