所以我的問題是我在此處發布的問題的后續:
Laravel 8 - 限制連接表
并使用已接受答案中的建議,這就是我最終得到的
User::with(['profile'])->with('collections.game')
->whereHas('collections', function (Builder $query) {
return $query->whereHas('game', function (Builder $query) {
return $query->where('status', '<>', 'denied');
});
})
->paginate(10)
它作業得很好。users我從和profiles表以及所有collections用戶擁有的games不具有拒絕狀態的用戶獲取有關用戶的資訊。甜的!謝謝@matiaslauriti!
我看到的問題是所有列都被拉入。這包括有關用戶的資訊,例如他們的電子郵件地址(來自用戶表)和他們的實際郵寄地址(來自個人資料表)等等。我不愿透露的資訊。
在正常情況下,這不會成為問題,因為一旦刀片模板被決議并生成頁面的標記,所有這些資料都會被丟棄并且不會回傳到瀏覽器。但我的情況不同。我將 InertiaJS 與 React 一起使用,因此所有這些資料都通過 XHR 請求從服務器回傳,并作為道具傳遞給我的組件。這使得所有資料都完全可見,我絕對不希望這樣。
我玩過::without(),::withOnly()但我無法讓他們作業。不僅不適用于用戶,還適用于嵌套的組態檔資料。那么有沒有辦法做我正在做的事情來獲取我需要的所有資料但沒有我寧愿不回傳給客戶端的所有敏感資料?
謝謝,
克里斯托夫
uj5u.com熱心網友回復:
可以通過傳遞一個閉包函式with()作為陣列的第二個索引來完成。
例子:
Post::query()
->with(['user' => function ($query) {
$query->select('id', 'username');
}])
->get()
它只會從其他表中選擇id和。username
請記住,主鍵(在本例中為 id)需要是 $query->select() 中的第一個引數才能實際檢索必要的結果。*
uj5u.com熱心網友回復:
如果您正在使用 JSON 回應(例如,您有一個 API)并且如果您想要有一種標準方式在您的資料中創建“視圖”以便在特定回應中顯示它們,您可以使用JSON 資源來做到這一點(如果這兩個不適用于你,那么你可以忽略這個答案)
在您的情況下,您可以創建兩個資源,例如UserResource并將ProfileResource它們實作為:
用戶資源:
public function toArray($request)
{
return [
'id' => $this->id,
'name' => $this->name,
'profile' => new ProfileResource($this->profile),
];
}
簡介資源:
public function toArray($request)
{
return [
'public_info' => $this->public_info,
];
}
正如檔案所述,您可以將此回應發送為:
$users = User::with(['profile'])->with('collections.game')
->whereHas('collections', function (Builder $query) {
return $query->whereHas('game', function (Builder $query) {
return $query->where('status', '<>', 'denied');
});
})
->paginate(10);
return UserResource::collection($users);
uj5u.com熱心網友回復:
呼叫該whereHas方法將永遠不會選擇相關記錄。with因此,如果您只想運行關系洗掉查詢query
User::query()
->whereHas('collections', function (Builder $query) {
return $query->whereHas('game', function (Builder $query) {
return $query->where('status', '<>', 'denied');
});
})
->paginate(10);
您也可以使用點關系
User::query()
->whereHas('collections.game', function (Builder $query) {
return $query->where('status', '<>', 'denied');
})
->paginate(10);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/419105.html
標籤:
