有以下表格:lists、和具有列和items的資料透視表。items_to_listslist_iditems_id
我知道list_idandaccount_id我需要獲取items屬于它并且屬于account(有accounts表)的所有(具有特定列),
我目前嘗試了以下方法:
$items = Lists::with(['items' => function ($query) {
$query->select('column1', 'column2');
}])->find(3);
但它看起來效率不高,因為它還獲取每個專案的資料透視表資料:
"items": [
{
"id": 1,
"name": "Item Name",
"pivot": {
"id"..
"list_id"..
"item_id"..
}
},
// ..
什么查詢更適合這個目的?它是否更接近原始 SQL,或者我仍然可以使這種雄辯的高效并僅選擇所需的資料(沒有資料透視)?
uj5u.com熱心網友回復:
Eloquent 必須有資料透視表。如果您不topic_id從選定列中洗掉 ,則不會回傳任何結果,因為它關聯資料的方式。
假設您有一個資料透視模型,您可以在 List 和(或者您想呼叫該模型)之間items_to_lists創建HasMany關系,然后自定義查詢以使其加入您的模型。ItemToListItem
class ItemToList extends Pivot
{
protected $table = 'items_to_lists';
}
class List extends Model
{
...
public function item_to_list()
{
return $this->hasMany(ItemToList::class, 'item_id');
}
}
$items = Lists::query()
->with(['item_to_list' => function ($query) {
$query->select('i.name', 'list_id', 'item_id')
->join('items as i', 'i.id', 'item_id');
}])
->find(3);
為了進行比較,您的原始查詢會創建以下 SQL 查詢:
-- Query 1
select ...
from "lists" where "lists"."id" = 3
limit 1
-- Query 2
select
"items"."name",
"items_to_lists"."list_id" as "pivot_list_id",
"items_to_lists"."item_id" as "pivot_item_id"
from "items"
inner join "items_to_lists" on "items"."id" = "items_to_lists"."item_id"
where "items_to_lists"."topic_id" in (3)"
我寫的替代方案會生成以下查詢
-- Query 1
select ...
from "lists" where "lists"."id" = 3
limit 1
-- Query 2
select
"i"."name",
"list_id",
"item_id"
from "items_to_lists"
inner join "items" as "i" on "item_id" = "i"."id"
where "items_to_lists"."list_id" in (3)
如您所見,查詢幾乎相同。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/430327.html
