我有以下口才的查询,该查询在模型上大量使用了relationships,并且有效。
这里是:
$trip = ModelLocale::where("lang",$lang)
->where("slug",$slug)
->where('mainmodel_id',$id)
->with(['mainmodel' => function ($query) use ($id)
{
$query
->where('id', $id)
->with(['convertedPrices' => function ($nestedQuery) use($id)
{
$nestedQuery
->where('model_id', $id)
->where('currency', Function::getCurrency());
}])
->with(['othermodel','othermodel2', /** */, 'othermodel5']);
}])
->first();
无论如何,这是有效的,仅是示例。
我的问题是我得到了很多嵌套关系,并且在进入视图时有点混乱。
我有另一个团队成员,雄辩的关系或我们进行此查询的特定方式可能会更改,但是视图或多或少总是需要相同的数据。因此,在将其传递给我的视图之前,我想组织/清理该查询并对其进行标准化。
这有意义吗?
我了解到Eloquent的每次回报都是其中的一个实例-Collection。
但是我在处理各种方法时遇到了一些问题,因为当我dd()
我的收藏时,我看到了那么多的属性和嵌套。
在保持各种关系模型的完整性的同时,推荐使用什么方法来操纵这个大集合?例如,此查询将在顶部返回一个ModelLocale
,然后返回与另一个模型的关系属性(我不需要的其他属性,例如perPage
和wasRecentlyCreated
),然后在第二个模型上有更多的嵌套关系。我想结合前两个模型,并且只具有 one 父级的关系。
例如,当我dd
时,我得到:
-Model 1:
--Many properties
--Relations:
---Model 2
----Many properties
----Relations:
-----Model 3
-----Model 4
-----etc
有没有简单的方法,所以当我在视图中时,......
$model->model_relationship->model_relationship->atrribute
...我可以重新组织这些并合并两个第一个模型?还是重命名和映射关系和属性,而忽略无关的属性,并为视图创建非常简单的属性数组?
抱歉,这不是非常具体,我无法从数据库中显示确切的值,关键是它会发生变化……所以我正在寻找有关此类馆藏重组的一般指导。
我比JSON更适应JSON,并且在阅读"are like arrays on steroids"某个地方的集合时,我对集合的结构感到有些害怕。
以下是集合的示例:
ModelLocale {#246 ▼
#fillable: array:1 [▶]
#connection: "mysql"
#table: "model_locales"
#primaryKey: "id"
#keyType: "int"
+incrementing: true
#with: []
#withCount: []
#perPage: 15
+exists: true
+wasRecentlyCreated: false
#attributes: array:8 [▼
"id" => 580
"main_model_id" => 290
"title" => "Dolor dolores et hic."
"slug" => "dolor-dolores-et-hic"
"body" => "Enim consequuntur aliquam et iste aut incidunt corporis voluptates. Est sapiente doloribus est inventore delectus. Quia sequi doloremque nesciunt nulla non minu ▶"
"lang" => "fj"
"created_at" => "2019-01-16 19:17:43"
"updated_at" => "2019-01-16 19:17:43"
]
#original: array:8 [▶]
#changes: []
#casts: []
#dates: []
#dateFormat: null
#appends: []
#dispatchesEvents: []
#observables: []
#relations: array:1 [▼
"MainModel" => MainModel{#255 ▼
#guarded: array:1 [▶]
#hidden: array:2 [▶]
#connection: "mysql"
#table: "mainmodels"
#primaryKey: "id"
#keyType: "int"
+incrementing: true
#with: []
#withCount: []
#perPage: 15
+exists: true
+wasRecentlyCreated: false
#attributes: array:16 [▼
"id" => 290
"model2_id" => 17
"model3_id" => 0
"model4_id" => 451
"price" => "385.00"
"created_at" => "2019-01-16 19:17:42"
"updated_at" => "2019-01-16 19:17:43"
]
#original: array:16 [▶]
#changes: []
#casts: []
#dates: []
#dateFormat: null
#appends: []
#dispatchesEvents: []
#observables: []
#relations: array:7 [▼
"model3" => Model 3{#267 ▶}
"model4" => Model 4{#264 ▶}
"model5" => Model 5{#307 ▼
#guarded: array:1 [▶]
#connection: "mysql"
#table: "model5s"
#primaryKey: "id"
#keyType: "int"
+incrementing: true
#with: []
#withCount: []
#perPage: 15
+exists: true
+wasRecentlyCreated: false
#attributes: array:7 [▶]
#original: array:7 [▶]
#changes: []
#casts: []
#dates: []
#dateFormat: null
#appends: []
#dispatchesEvents: []
#observables: []
#relations: []
#touches: []
+timestamps: true
#hidden: []
#visible: []
#fillable: []
}
"model6" => Collection {#311 ▶}
"model7" => Collection {#312 ▶}
"model8" => null
"model9" => Collection {#368 ▶}
]
#touches: []
+timestamps: true
#visible: []
#fillable: []
}
]
#touches: []
+timestamps: true
#hidden: []
#visible: []
#guarded: array:1 [▶]
}
因此,我有ModelLocale
,它与MainModel
有关系,而Pattern pattern = Pattern.compile("\"_id\"\\s*:\\s*\"(.*?)\"");
Matcher matcher = pattern.matcher(json);
List<String> ids = new ArrayList<>();
while(matcher.find()) {
ids.add(matcher.group(1));
}
与其他模型又有若干关系。但是我只想要一个非常简单(尽可能多)的我关心的属性数组-因为嵌套或关系可能会再次改变...
答案 0 :(得分:1)
我有两点建议。
首先,将查询限制为在可能的情况下仅渴望加载特定的列。
您可能并不总是需要所检索关系中的每一列。因此,Eloquent允许您指定要检索的关系的哪些列:
$users = App\Book::with('author:id,name')->get();
第二,使用响应转换器-参见Eloquent: API Resources-在发送响应之前对数据进行整形。这样可以保证您需要的数据具有固定格式。
这两件事将减少响应负载并提供合理,有组织的结构。