簡體   English   中英

在 Laravel 中建立一種 BelongsToThrough 關系

[英]Setting up a kind of BelongsToThrough relationship in Laravel

這是我目前的情況:

  • 我有一個任務 model。
  • 任務有所有者(belongsTo 關系)
  • 所有者有帳戶(還有另一個 belongsTo 關系)

我想建立從任務到帳戶的“belongsToThrough”關系。

我的第一個解決方案是在任務 model 中定義一個關系,如下所示:

    public function account(): BelongsTo
    {
        return $this->owner->account();
    }

有了它,我可以調用$task->account並輕松檢索任務的帳戶。 問題是這不適用於load / with ,這反過來又會導致問題,因為我無法refresh()已加載帳戶的任務(因為刷新使用負載)。 該錯誤只是說明Trying to call account() on null這確實是意料之中的。

我的第二個解決方案是將關系方法更改為:

    public function account(): BelongsTo
    {
        return $this->owner()->first()->account();
    }

有了這個,我也可以簡單地調用$task->account並檢索 model,加載時它不起作用(返回 null),但也不會拋出任何錯誤。 我不需要加載這種關系,只是碰巧有時我需要刷新模型並且讓加載方法拋出錯誤是不行的。

總之

我正在尋找的是一種 BelongsToThrough,因為任務將通過所有者(用戶)屬於帳戶。 有沒有一種方法可以同時使用$task->account$task->load('account') 在你告訴我我可以使用owner.account加載它之前,我知道,但是refresh()會使用load('account')自動完成,所以我需要它像那樣工作,而不是使用點符號。

要使其與load()一起使用,您需要在owner model 上定義account關系,如果您還沒有這樣做的話。 像這樣:

public function account() :BelongsTo
{
    return $this->belongsTo(AccountsTable);
}

然后在您的任務 model 上調用load()時使用點符號,例如:

$task->load('owner.account');

您可以使用急切加載來做到這一點

public function account()
{
    return $this->belongsTo('App\ParentModel', 'foreignkey', 'localkey');
}

之后,您可以輕松地使用 load/with 獲取關系數據。

謝謝,

暫無
暫無

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

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