簡體   English   中英

Laravel 嵌套預加載特定列

[英]Laravel nested eager load specific columns

我正在使用嵌套的急切加載,有沒有辦法從account.user.location的中間關系中挑選出某些列?

用戶模型

 public function account(): HasMany
    {
        return $this->hasMany(Account::class);
    }

 public function location(): BelongsTo
    {
        return $this->belongsTo(Location::class);
    }

賬戶模型

 public function user(): BelongsTo
{
    return $this->belongsTo(User::class);
}

位置模型

 public function user(): HasMany
{
    return $this->hasMany(User::class);
}

有效的控制器方法

此方法返回嵌套關系,但我想要用戶關系中的某些列,而不是將它們全部列出。

    public function show(string $id)
{
    $film = Film::with([
        'account.user.location'
    ])->findOrFail($id);
}

控制器方法不起作用

這是我的示例代碼,我試圖從用戶那里挑選出name列,然后顯示位置關系。

    public function show(string $id)
{
    $film = Film::with([
        'account.user:id,name',
        'account.user.location:id',city
    ])->findOrFail($id);
}

回復

這是返回的響應,它從不工作的方法返回位置為空

 +"account": {#2061
  +"id": "191067a6-4c38-423d-a972-bb3a842ca89e"
  +"user": {#2064
    +"id": "d9f381c1-3899-367c-8d60-6d2bc3db6d23"
    +"name": "Domenick"
    +"location": null

我不確定如何從中間關系中挑選特定的列然后加入該位置。 我能得到一些關於我哪里出錯的幫助嗎?

更新您的用戶模型

public function account()
    {
        return $this->hasMany(Account::class, 'user_id');
    }

 public function location()
    {
        return $this->belongsTo(Location::class);
    }

將您的帳戶類更新為

public function user()
{
    return $this->belongsTo(User::class, 'user_id');
}

在你的控制器方法中試試這個

public function show($id)
{
    $film = Film::where('id', $id)
    ->with([
        'account.user:id,name',
        'account.user.location:id',city
    ])->get();
}

在下面的代碼中:

$film = Film::with([
    'account.user:id,name',
    'account.user.location:id,city'
])->findOrFail($id);

第二行'account.user.location:id,city'將不會被執行,因為第一行'account.user:id,name'已加載(Laravel檢查是否使用已經加載的關系relationLoaded )的account.user 就您而言,您可以嘗試以下操作:

$film = Film::with(['account.user' => function($userQuery) {
    $userQuery->with('location:id,city')->select('id, name');
}])->findOrFail($id);

Laravel 正在加載每個級別的關系。 換句話說,如果你使用A::with('b.c')->get() ,那么 Eloquent 將首先加載所有A ,然后是所有它們引用的B ,最后是所有被引用的C 。加載B ORM 使用導航屬性(即外鍵)來執行此操作。 如果您在中間模型上省略這些外鍵,則框架將無法再加載引用的模型。

如果您手動執行此操作,您將使用以下查詢(使用的 ID 和外鍵是示例):

SELECT * FROM a;                         // returns As with ids 1, 2, 3
SELECT * FROM b WHERE a_id IN (1, 2, 3); // returns Bs with ids 4, 5, 6
SELECT * FROM c WHERE b_id IN (4, 5, 6);

在您的情況下,使用以下代碼就足夠了:

public function show(string $id)
{
    $film = Film::with([
        'account.user:id,account_id,location_id,name',
        'account.user.location:id,city'
    ])->findOrFail($id);
}

暫無
暫無

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

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