Eloquent模型中關(guān)于hasMany和blongsTo的外鍵設(shè)置的解析

laravel中Eloquent模型是一種面向?qū)ο蟮膶?shù)據(jù)庫的封裝,里面定義了<code>hasOne\hasMany</code>與其對應(yīng)的<code>belongsTo</code>,還有最后就是多對多關(guān)系的belongsToMany。表面的意思很簡單,一個一個來說。

hasMany

這個最好理解,就是一個<code>用戶</code>對應(yīng)一篇<code>文章</code>。
<code>hasOne</code>是一種獲取方式,獲取對應(yīng)的一個內(nèi)容。

class User extend Model{
    publi funtion article(){
        return $this->hasOne('Article');
    }
}

然后在控制器controller里可以這樣使用。

class Acontroller extend Controller{
    public funtion index(){
        $article=User::find(1)->article();
    }
}

這里就不細(xì)說了,別的用發(fā)很類似,具體可以看官方文檔,這樣可以明白。這里主要通過一個例子來解釋一個,如果使用里面的外鍵功能,hasOne\hasMany\BelongsTo都有定義外鍵的功能。首先hasOne\hasMany\BelongsTo都有默認(rèn)定義外鍵的功能。下面通過一個例子說明。
Client.php

nameSpace App;
use Illuminate\Database\Eloquent\Model;
class Client extend Model{
    protected $fillable=['name','company_name','vat','email','address','zipcode','city','primary_number','secondary_number','industry_id','company_type','fk_user_id'];
    public funtion userAssignee(){
        return $this->belongsTo('App\User','fk_user_id','id');
    }
  
    public funtion alltask(){
        return $this->hasMany('App\Tasks','fk_client_id','id')->orderBy('status','asc')->orderBy('created_at', 'desc');
    }
    public funtion allleads(){
        return $this->hasMany('App\Leads','fk_client_id','id')->orderBy('status', 'asc')->orderBy('created_at', 'desc');
    }
}

Leads.php

namespace App;
use Illuminate\Database\Eloquent\Model;
use Carbon;
class Leads extends Model{
      protected $fillable = [    'title',    'note',    'status',    'fk_user_id_assign',    'fk_user_id_created',    'fk_client_id',    'contact_date',    ];
      protected $dates = ['contact_date'];
      protected $hidden = ['remember_token'];
      public function clientAssignee(){
                return $this->belongsTo('App\Client', 'fk_client_id');
      }
      public function notes(){
              return $this->hasMany('App\Note', 'fk_lead_id', 'id');
      }
}

首先先看Client.php里面的allleads方法,里面用到了<code>$this->hasMany('App\Leads','fk_client_id','id')</code>,這里的內(nèi)容指定是調(diào)用App\Leads中的fk_client_id外鍵,如果不指定就會調(diào)用默認(rèn)的<code>Client_id</code>這個外鍵,所以調(diào)用默認(rèn)外鍵的規(guī)律就是:本類名+id,但是這個外鍵在被調(diào)用的這個類(App\Leads)上。如果指明外鍵,那就不用默認(rèn)外鍵了,但是這個這個外鍵依然在被調(diào)用的類上。下面看看Leads的數(shù)據(jù)遷移部分就知道了。

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

class CreateLeadsTable extends Migration{
     public function up()
    {
        Schema::create('leads', function (Blueprint $table) {
            $table->increments('id');
            $table->string('title');
            $table->text('note');
            $table->integer('status');
            $table->integer('fk_user_id_assign')->unsigned();
            $table->foreign('fk_user_id_assign')->references('id')->on('users');
            $table->integer('fk_client_id')->unsigned();
            $table->foreign('fk_client_id')->references('id')->on('clients');
            $table->integer('fk_user_id_created')->unsigned();
            $table->foreign('fk_user_id_created')->references('id')->on('users');
            $table->datetime('contact_date');
            $table->timestamps();
        });
    }
}

在Lead的表創(chuàng)建過程中,明確指定了Lead的外鍵fk_client_id關(guān)聯(lián)的是clients類的id屬性,這樣就串起來了吧。如果使用自定義的外鍵,那就在被調(diào)用(leads)的時候,告訴調(diào)用者(clients),具體是哪個外鍵(fk_client_id)。

belongsTo

belongsTo外鍵的使用剛好和hasMany反過來,看Client.php的userAssignee方法,里面用到了belongsTo方法,使用的外鍵是fk_user_id,但這個外鍵是調(diào)用者的外鍵,即Client的內(nèi)部定義的屬性,可以在fillable內(nèi)看到,這樣就明確了,belongsTo里定義的外鍵是調(diào)用者(Client)內(nèi)部定義外鍵,鏈接著被調(diào)用者(User)。下面是Client的遷移,可以看到是在調(diào)用者內(nèi)部定義的外鍵。

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

class CreateClientsTable extends Migration
{

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('clients', function (Blueprint $table) {
        
            $table->increments('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->integer('primary_number');
            $table->integer('secondary_number');
            $table->string('address');
            $table->integer('zipcode');
            $table->string('city');
            $table->string('company_name');
            $table->integer('vat');
            $table->string('industry');
            $table->string('company_type');
            $table->integer('fk_user_id')->unsigned();
            $table->foreign('fk_user_id')->references('id')->on('users');
            $table->integer('industry_id')->unsigned();
            $table->foreign('industry_id')->references('id')->on('industries');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        DB::statement('SET FOREIGN_KEY_CHECKS = 0');
        Schema::drop('clients');
        DB::statement('SET FOREIGN_KEY_CHECKS = 1');
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,836評論 6 540
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,275評論 3 428
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,904評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,633評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,368評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,736評論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,740評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,919評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,481評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,235評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,427評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,968評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,656評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,055評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,348評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,160評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,380評論 2 379

推薦閱讀更多精彩內(nèi)容