簡體   English   中英

laravel設置外鍵

[英]laravel set up a foreign key

我是laravel的新手,我正在做一個項目,首先用戶注冊,他的信息將存儲在User表中,然后他或她登錄該網站,然后用戶將提供另一種形式的血統注冊唐納。 該信息將存儲另一個表,即blooddonners表。因此,我想在blooddonner表中創建外鍵。foreingn鍵將是user表中的id 。這就是為什么我為blooddonner表創建了遷移,

<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateBlooddonnerTable extends Migration {

/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    Schema::create('blooddonners', function(Blueprint $table)
    {
        $table->increments('id');
        $table->unsignedInteger('donner_id');
        $table->foreign('donner_id')->references('id')->on('users')->onDelete('cascade')->onUpdate('cascade');
        $table->string('donner_name');
        $table->string('email')->unique();
        $table->string('blood_group');
        $table->string('phone_number')->unique();
        $table->string('location');
        $table->date('date_of_birth');
        $table->date('last_date_of_donation');
        $table->timestamps();
    });
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    Schema::drop('blooddonners');
}

}

但是提交表格后,我遇到以下錯誤,

Illuminate \ Database \ QueryException
SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row:    a foreign key constraint fails (`needa`.`blooddonners`, CONSTRAINT    `blooddonners_donner_id_foreign` FOREIGN KEY (`donner_id`) REFERENCES `users` (`id`) ON    DELETE CASCADE ON UPDATE CASCADE) (SQL: insert into `blooddonners` (`date_of_birth`,    `blood_group`, `location`, `email`, `phone_number`, `last_date_of_donation`, `updated_at`,    `created_at`) values (2014-08-06, A-, SHERPUR, raihn_cse@yahoo.com, 01796580404, 2014-08-  20, 2014-08-10 19:42:38, 2014-08-10 19:42:38))

盡管我在Laravel中是個新手,所以我有一個問題,就是我在遷移文件中設置外鍵的方式,這是設置外鍵的正確方法嗎?導致錯誤與該外鍵有關。

設置外鍵的方式沒有任何問題。 事實證明,MySQL實際上阻止了您插入違反您要求它強制執行的外鍵的條目。 問題是您嘗試添加blood donor條目而不指定與之相關的user 您有兩個選擇,然后:

  1. 在用於添加新獻血者的查詢中,指定相關用戶的ID;
  2. 即使donor_id是外鍵,如果您想要的話,它也可以為空,盡管您需要告訴Laravel / MySQL。

以下是定義可為空的列的方法:

$table->unsignedInteger('donor_id')->nullable();

我已采取糾正您的拼寫的自由: 獻血者>獻血者 正確的拼寫也有助於代碼可讀性;)


編輯

如果您想就如何改進數據庫設計以充分利用外鍵提出建議,請按照以下方法進行操作:

第一件事:如果不是每個用戶都是獻血者,我只會擁有一個輔助的blood_donors表。 如果您的用戶100%是獻血者,請不要過於復雜:僅使用一張表格並添加更多列。 否則,請繼續閱讀。

我的users表可能包含與一般個人信息有關的所有列:

  • 名稱
  • 電子郵件
  • 電話號碼( 用戶唯一)
  • 位置
  • 出生日期

之后,我可以通過foreign keys “鏈接” users表和blood_donors表,這樣我就不必重復自己了。 我所需要知道的是哪個用戶對應於哪個獻血者,而我要做的只是一個身份證。 這樣,當我對數據庫進行查詢時,無論查詢最初是在blood_donors還是在users表上,我都可以輕松地join兩個表連接在一起並一次擁有所有數據,而不必在兩個不同的地方重復進行。

因此,回到您的遷移,現在就足夠了:

Schema::create('blooddonners', function(Blueprint $table)
{
    $table->increments('id');
    $table->unsignedInteger('user_id');
    $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade')->onUpdate('cascade');
    $table->string('blood_group');
    $table->date('last_date_of_donation');
    $table->timestamps();
});

也就是說,您在blood_donors表中不需要“供體名稱”,因為您已經在用戶表中記錄了該名稱,畢竟他們是同一個人。 您應該具有僅與獻血有關的列。

然后,您可以使用類似這樣的查詢訪問所有這些數據(假設您已經設置了模型):

User::join('blood_donors', 'users.id', '=', 'blood_donors.user_id')->get();

您將同時擁有一個同時包含兩個表的列的對象。 請注意,名稱完全相同的列將在最終對象中相互覆蓋,因此,如果要可靠地訪問該對象中的兩個ids ,最好在查詢的select部分指定別名。 您甚至可以根據需要更改列名稱。 在Laravel中,您可以這樣操作:

User::select('users.*', 'users.name as donor_name', 'blood_donors.id as donor_id')
    ->join('blood_donors', 'users.id', '=', 'blood_donors.user_id')
    ->get();

查看有關關系Eloquent文檔,以了解如何使數據庫設計更進一步,同時仍保持清晰易讀的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM