Laravel 5(.7)组织具有多个关系的模型/集合

时间:2019-01-17 03:20:30

标签: php laravel laravel-5

我有以下口才的查询,该查询在模型上大量使用了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,然后返回与另一个模型的关系属性(我不需要的其他属性,例如perPagewasRecentlyCreated),然后在第二个模型上有更多的嵌套关系。我想结合前两个模型,并且只具有 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)); } 与其他模型又有若干关系。但是我只想要一个非常简单(尽可能多)的我关心的属性数组-因为嵌套或关系可能会再次改变...

1 个答案:

答案 0 :(得分:1)

我有两点建议。

首先,将查询限制为在可能的情况下仅渴望加载特定的列。

  

您可能并不总是需要所检索关系中的每一列。因此,Eloquent允许您指定要检索的关系的哪些列:

$users = App\Book::with('author:id,name')->get();

第二,使用响应转换器-参见Eloquent: API Resources-在发送响应之前对数据进行整形。这样可以保证您需要的数据具有固定格式。

这两件事将减少响应负载并提供合理,有组织的结构。