Laravel/Eloquent - Eager loaded hidden/visible properties Laravel/Eloquent - 预加载隐藏/可见属性
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起作用。但是如何做到呢?
Laravel/Eloquent - Eager loaded hidden/visible properties问题的原因是,当使用Eloquent的eager loading功能时,如果模型中定义了隐藏或可见的属性,这些属性将被默认加载,即使在查询中没有明确指定。这可能导致查询结果中包含不必要的属性,增加了查询的数据量和性能消耗。
为了解决这个问题,可以尝试直接从查询中选择需要使用的属性,这样可以避免加载不必要的属性。可以使用select
方法来实现这一点,将需要使用的属性以数组的形式传递给select
方法。
下面是一个示例代码,演示如何使用select
方法来选择需要的属性:
User::select(['id', 'field_name_1'])->get();
在这个示例中,只选择了id
和field_name_1
这两个属性,其他隐藏或可见的属性将被忽略,从而减少了查询结果的数据量和性能消耗。
在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模型中隐藏或显示特定属性,提高了代码的灵活性和可复用性。
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()方法来实现需求。