[英]Laravel Database Schema, Nullable Foreign
我有这两个数据库表:
用户表将处理此类信息
Schema::create('users', function (Blueprint $table) {
$table->increments('id')->unique();
$table->string('email')->unique();
$table->string('username')->unique();
$table->string('password', 60);
$table->string('photo')->nullable();
$table->integer('partner_id')->unsigned();
$table->foreign('partner_id')->references('id')->on('partners');
$table->rememberToken();
$table->timestamps();
});
而合作伙伴表将包含所有用户元信息,例如名字和姓氏等。
Schema::create('partners', function (Blueprint $table) {
/**
* Identity Columns
*/
$table->increments('id')->unique();
$table->string('first_name');
$table->string('middle_name')->nullable();
$table->string('last_name')->nullable();
$table->string('display_name')->nullable();
$table->string('email')->unique()->nullable();
$table->string('website')->nullable();
$table->string('phone')->nullable();
$table->string('mobile')->nullable();
$table->string('fax')->nullable();
$table->date('birthdate')->nullable();
$table->longText('bio')->nullable();
$table->string('lang')->nullable(); //Language
/**
* Address Columns
*/
$table->text('street')->nullable();
$table->text('street2')->nullable();
$table->integer('country_id')->unsigned(); // foreign
$table->foreign('country_id')->references('id')->on('countries');
$table->integer('state_id')->unsigned(); // foreign
$table->foreign('state_id')->references('id')->on('country_states');
$table->string('city')->nullable();
$table->string('district')->nullable();
$table->string('area')->nullable();
$table->string('zip')->nullable();
});
当用户注册到该站点时,我只需要几个字段,即username
、 email address
、 password
、 first name
和last name
。 这些只是必填字段。
因此,合作伙伴表中的信息可以在用户完成网站注册后填写。
但是由于外键的结构,由于这个错误我无法继续进行:
SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`mytable`.`tbl_partners`, CONSTRAINT `partners_country_id_foreign` FOREIGN KEY (`country_id`) REFERENCES `tbl_countries` (`id`)) (SQL: insert into `tbl_partners` (`first_name`, `last_name`, `display_name`, `email`, `updated_at`, `created_at`) values (Jack, Wilson, admin, admin@example.com, 2016-06-09 19:41:18, 2016-06-09 19:41:18))
我知道这是由合作伙伴表所需的国家/地区表引起的。
我的问题是:是否有解决方法,以便我可以在合作伙伴表上填写国家或任何其他不需要的数据,但保留国家、州等的外部表模式。
为了让 laravel 7.x 创建一个可为空的外键,只需简单地使用:
$table->foreignId('country_id')->nullable()->constrained();
$table->foreignId('state_id')->nullable()->constrained();
记住: nullable应该在约束之前,否则 nullable 不会受到影响。
像这样设置country_id
和state_id
空。
$table->integer('country_id')->nullable()->unsigned();
$table->integer('state_id')->nullable()->unsigned();
使用最新版本的 Laravel,您可以结合使用nullable
方法来使用foreignKey
:
$table
->foreignId('other_table_id')
->nullable() // here
->references('id')
->on('other_table');
对于 Laravel 7.x,我使用这种方式:
$table->bigInteger('word_type_id')->nullable()->unsigned();
$table->index('word_type_id')->nullable();
$table->foreign('word_type_id')->nullable()->references('id')->on('word_types')->onDelete('cascade');
拉拉维尔 8
$table->foreignId('foreign_key_id')->nullable()->constrained()->onDelete('cascade');
请注意,如果您有 references('{column}')->on('{table}') ,则需要将 nullable()->constrained() 放在此之前,即:
$table->foreignId('author')->nullable()->constrained()->references('id')->on('users');
这是在 Laravel 9 上,但也可能更早。
最好的办法是
$table->unsignedBigInteger('country_id')->nullable();
$table->foreign('country_id')->references('id')->on('stock_indices')->onDelete('cascade');
$table->foreignId('profile_id')->nullable()->constrained('profiles')->onDelete('cascade');
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.