Laravel/Eloquent - Eager loaded hidden/visible properties Laravel/Eloquent - 预加载隐藏/可见属性

6 浏览
0 Comments

Laravel/Eloquent - Eager loaded hidden/visible properties Laravel/Eloquent - 预加载隐藏/可见属性

在使用Laravel的Eloquent ORM时,我似乎无法动态设置Model的$hidden和$visible属性。

示例1:这个可以工作:

class User extends Eloquent {
   $this->visible = array('field_name');
   function read() 
   {
      return User::all();
   }
}

示例2:动态设置Eloquent类的visible属性无效:

class User extends Eloquent {
   function read($visible = array('field_name'))
   {
      $this->visible = $visible; // 也尝试过:$this->setVisible($visible);
      return User::all();
   }
}

示例3:在Model本身上可以工作的解决方案,但在急加载的Models上无效:

class User extends Eloquent {
   function read($visible = array('field_name'))
   {
      $users = User::all();
      return $users->get()->each(function($row) use ($visible) {
         $row->setVisible($visible);
      });
   }
}

为了在急加载的Models上动态设置$visible属性,我没有看到其他解决方案,只能使示例2起作用。但是如何做到呢?

0
0 Comments

Laravel/Eloquent - Eager loaded hidden/visible properties问题的原因是,当使用Eloquent的eager loading功能时,如果模型中定义了隐藏或可见的属性,这些属性将被默认加载,即使在查询中没有明确指定。这可能导致查询结果中包含不必要的属性,增加了查询的数据量和性能消耗。

为了解决这个问题,可以尝试直接从查询中选择需要使用的属性,这样可以避免加载不必要的属性。可以使用select方法来实现这一点,将需要使用的属性以数组的形式传递给select方法。

下面是一个示例代码,演示如何使用select方法来选择需要的属性:

User::select(['id', 'field_name_1'])->get();

在这个示例中,只选择了idfield_name_1这两个属性,其他隐藏或可见的属性将被忽略,从而减少了查询结果的数据量和性能消耗。

0
0 Comments

在Laravel/Eloquent中,有时候我们希望在返回的模型集合中隐藏或显示特定的属性。然而,Eloquent默认情况下只会返回模型中的可见属性。为了解决这个问题,我们可以使用Eloquent提供的get()方法的自定义实现。

上面的代码片段是为了实现这个目的而创建的一个Trait(特征)。这个Trait命名为Serialization,并包含一个名为getSerialized的方法。这个方法的作用类似于Eloquent的get()方法,但它接受一个数组类型的参数。

在使用getSerialized方法时,我们可以传入一个参数数组,其中可以包含三个键值对:

- appends:用于指定要附加到返回的模型中的属性列表。

- hidden:用于指定要隐藏的属性列表。

- visible:用于指定要显示的属性列表。

通过调用getSerialized方法,并传入相应的参数,我们可以获取到一个符合参数要求的模型集合。

为了实现这个功能,Serialization Trait包含了一些私有变量,用于存储appends、hidden和visible这三个参数的值。在构造方法中,我们将这些参数的值赋给对应的模型属性。

同时,Serialization Trait还提供了一个scopeGetSerialized方法,用于处理getSerialized方法传入的参数,并返回符合参数要求的模型集合。在这个方法中,我们首先通过查询构建器的get()方法获取到原始的模型集合。然后,将之前存储的属性参数值重新赋给对应的私有变量。

最后,我们返回处理后的模型集合。

通过使用Serialization Trait,我们可以方便地在Eloquent模型中隐藏或显示特定属性,提高了代码的灵活性和可复用性。

0
0 Comments

Laravel/Eloquent - Eager loaded hidden/visible properties

Laravel是一个流行的PHP框架,提供了强大的ORM工具Eloquent。Eloquent是Laravel中的一个模型类,用于与数据库交互。在使用Eloquent时,有时我们需要控制模型类中隐藏或显示的属性。

在Eloquent中,有两个属性可以控制模型类中属性的隐藏或显示,分别是$hidden和$visible。$hidden属性定义了模型类中隐藏的属性,而$visible属性定义了模型类中可见的属性。当我们在返回模型类实例时,指定了$hidden属性中的属性将不会被返回,而指定了$visible属性中的属性将会被返回。

然而,在使用Eloquent的时候,当我们进行预加载(eager loading)时,隐藏或显示的属性将不会起作用。

问题的出现是因为$visible属性是在实例级别上设置的,而不是在所有相同类型的模型之间共享的静态变量。因此,没有更好的方法来解决这个问题。

解决方法是通过使用匿名函数来重新定义属性的可见性。我们可以使用Eloquent提供的with()方法来进行预加载,并在with()方法中传递一个匿名函数来重新定义属性的可见性。

以下是解决方法的示例代码:

$users = User::with(['posts' => function ($query) {
    $query->setVisible(['title', 'content']);
}])->get();

在上面的代码中,我们通过with()方法进行预加载,并在匿名函数中使用setVisible()方法来重新定义posts模型中可见的属性,只返回title和content属性。

通过以上方法,我们可以在Eloquent中实现预加载时隐藏或显示属性的需求。

在使用Laravel/Eloquent进行预加载时,隐藏或显示属性的设置不会生效。这是因为$visible属性是在实例级别上设置的,没有更好的方法来解决这个问题。然而,我们可以通过使用匿名函数来重新定义属性的可见性,并在预加载时使用with()方法来实现需求。

0