簡體   English   中英

如何在Laravel(5.4)Eloquent中定義單向一對一關系?

[英]How to define a one-way one-to-one relationship in Laravel (5.4) Eloquent?

想想我這里缺少明顯的東西,但是我想定義一種從表_1到表_2的一對一關系,例如表1模式:

    Schema::create('table1', function (Blueprint $table) {
        // Some field definitions
        $table->integer('table2_id')->unsigned();
        $table->foreign('table2_id')->references('id')->on('table2')->onDelete('cascade');
    });

表2對表1一無所知,因此只定義了一堆字段。 表1的模型具有:

public function table2() // Get table2 record
    {
        return $this->hasOne('App\Table2');
    }

問題:

a。)記錄中的關系是否僅需要能夠從table1記錄中查找相關的table2記錄?

b。)如何在代碼中設置關系? 目前,我的控制器代碼是:

$table_1_record = new Table1();
// What code here to define the relationship, using Eloquent? Or do I just do:
$table_1_record->table2_id = my_table2_record->id;
// But this just sets it manually doesn't it, rather than using Eloquent?

讓我感到困惑的是在這里: https : //laravel.com/docs/5.6/eloquent-relationships#one-to-one距離鏈接較遠,它說

雄辯地基於模型名稱確定關系的外鍵。 在這種情況下,將自動假定Phone模型具有user_id外鍵。

將該示例應用於我的代碼,事情是我不想在我的Table_2中定義table1_id-但聽起來像是我需要從文檔中引用的內容,以便從table1中找到table2記錄...?

c。)遷移中的這一行是否有任何意義: $table->foreign('table2_id')->references('id')->on('table2')->onDelete('cascade'); 並確實使用了Eloquent(我想以正確的Laravel方式做事),還是我應該像問題b那樣簡單地手動設置table2_id)?

注意:我不想定義關系的倒數,因為我不需要從table_2記錄中找到table_1記錄。

謝謝你的幫助。

雄辯的關系僅在定義的方向上起作用。 如果希望能夠基於Table1定義的外鍵查找Table2 ,則可以僅向Table1模型添加關系。 您無需為兩個方向定義兩個模型上的關系。

給定您的table1模式,您實際上正在使用一對一關系的逆函數 table1被視為table2的子級。 您的關系如下所示:

class Table1
{
    public function table2()
    {
        return $this->belongsTo(\App\Table2::class);
    }
}

至於設置關系,我的建議是在創建初始記錄時簡單地手動應用table2的ID:

`$table1->table2_id = $table2->id;`

如果要更新Table1記錄,則可以使用associate() 有關更多信息,請參見文檔。 請注意,這確實需要您在Table2上定義關系的另一端。 如果您不想這樣做,也可以在更新時手動更新列。

請記住,所有這些都是由Eloquent提供支持的。 僅僅因為您手動定義列值而不是使用關系幫助器方法並不意味着您在做無效或不正確的事情。

遷移中[外鍵]行中是否有任何意義

這會在數據庫軟件本身中創建外鍵約束,與Eloquent無關。 口才不使用或不在乎您是否定義了外鍵。 但是,使用外鍵有很多好處,建議您進一步研究一下外鍵,以確定它們是否適合您的應用程序。

暫無
暫無

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

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