使用 Laravel 的 foreignIdFor 方法并创建复合唯一键

Posted

技术标签:

【中文标题】使用 Laravel 的 foreignIdFor 方法并创建复合唯一键【英文标题】:Using Laravel's foreignIdFor method and create a composite unique key 【发布时间】:2021-11-22 17:11:38 【问题描述】:

按照下面的语法,我可以根据namebakery_id 字段轻松创建复合唯一键:

Schema::create('product_categories', function (Blueprint $table) 
    $table->id();
    $table->foreignId('bakery_id')->constrained();
    $table->string('name', 30);
    $table->boolean('enabled')->default(true);
    $table->timestamps();

    $table->unique(['bakery_id', 'name']);
);

当我使用“foreignIdFor()”方法而不是“foreignId()”时,有没有办法以编程方式确定列的名称?

Schema::create('product_categories', function (Blueprint $table) 
    $table->id();
    $table->foreignIdFor(Bakery::class)->constrained();
    $table->string('name', 30);
    $table->boolean('enabled')->default(true);
    $table->timestamps();

    $table->unique(['???', 'name']);
);

【问题讨论】:

【参考方案1】:

只需要捕获列定义并使用它:

Schema::create('product_categories', function (Blueprint $table) 
    $table->id();
    $colDef = $table->foreignIdFor(Bakery::class)->constrained();
    $table->string('name', 30);
    $table->boolean('enabled')->default(true);
    $table->timestamps();

    $table->unique([$colDef->name, 'name']);
);

【讨论】:

你不能用$colDef->name吗?此外,不值得单独回答,但(new Bakery)->getForeignKey() 也可以。 @miken32 清理了属性【参考方案2】:

我不明白你的问题,但也许这可能会有所帮助

Schema::create('product_categories', function (Blueprint $table) 
   $table->id();
   // $table->foreignIdFor(Bakery::class)->constrained();
   $table->unsignedInteger('bakery_id')->nullable();
   $table->foreign('bakery_id')->references('id')->on('bake')->onDelete('cascade');
   $table->string('name', 30);
   $table->boolean('enabled')->default(true);
   $table->timestamps();

   $table->unique(['bakery_id', 'name']);
);

【讨论】:

以上是关于使用 Laravel 的 foreignIdFor 方法并创建复合唯一键的主要内容,如果未能解决你的问题,请参考以下文章

Laravel + React,使用 Laravel 身份验证的 api

Laravel 使用外部类

laravel中使用的PDF扩展包——laravel-dompdf和laravel-snappy

Laravel快速使用Elasticsearch

laravel和mongo怎么搭配使用

将 VueJS 添加到 Laravel 但继续使用 Laravel 的路由器等