sigep / eloquent-enhancements
本包旨在为Laravel的Eloquent提供额外功能
Requires
- php: >=7.0.0
- illuminate/database: ~5.4
- illuminate/support: ~5.4
Requires (Dev)
README
本包旨在为Laravel的Eloquent提供额外功能。目前,这些功能以特质的形式提供,因此您无需更改模型结构。
错误
此特质为您模型添加了两种方法。
use Sigep\EloquentEnhancements\Traits\Error
setErrors
接受一个MessageBag并将其设置在$errors
属性中。SaveAll使用它来存储错误,并允许您在控制器或视图中使用它们。
setErrors(Illuminate\Support\MessageBag $errors)
errors
返回由setErrors()
设置的错误。如果错误未定义,则创建一个空的MessageBag。
errors()
SaveAll
此特质添加了仅通过一个调用即可保存相关对象的能力。例如,如果您有一个与Phone模型相关联的用户模型,在hasMany关系下,您可以使用一个方法调用就保存一个具有多个电话的用户。
use Sigep\EloquentEnhancements\Traits\SaveAll;
考虑以下模型
class User extends Eloquent { use Sigep\EloquentEnhancements\Traits\Error; use Sigep\EloquentEnhancements\Traits\SaveAll; public function phones() { return $this->hasMany('Phone'); } } class Phone extends Eloquent { public function user() { return $this->belongsTo('User'); } }
我们强烈建议您使用模型观察者来验证您的数据,并使用
setErrors()
来传递验证消息。这是使用此特质时验证相关数据最佳方式。
您可以使用createAll()
方法创建一个具有两个电话的用户。
$input = array( 'name' => 'Bob', 'email' => 'bob@gmail.com', 'phones' => array ( array('number' => '1111111'), array('number' => '2222222'), ), ); $bob = new User(); $bob->createAll($input);
请注意,我们在User模型上创建了一个具有关系名称的键。这是必要的,这样SaveAll才知道涉及哪些模型以及如何保存数据。如果一切顺利,createAll将返回true。否则,将返回false。
现在,如果您需要使用用户模型(例如,当您有一个显示所有数据的表单时)编辑一个数字,您可以使用saveAll()
方法。
$input = array( 'name' => 'Bob', 'email' => 'bob@gmail.com', 'phones' => array ( array('id' => 1, 'number' => '111-1111'), array('id' => 2, 'number' => '222-2222'), ), ); $bob = User::find(1); // assuming bob have the id = 1 $bob->saveAll($input);
请注意,我们在数组中添加了数字的id
。这是必要的,这样SaveAll就知道这不是一条新记录,而是一个更新。
当您需要删除相关模型时,您只需传递_delete
键即可执行类似的操作。
$input = array( 'name' => 'Bob', 'email' => 'bob@gmail.com', 'phones' => array ( array('id' => 1, '_delete' => true), ), ); $bob = User::find(1); // assuming bob have the id = 1 $bob->saveAll($input);
在这种情况下,电话#1
将被删除。其他属性不是必要的,只需id
和_delete
键即可。
SaveAll
也可以处理BelongsToMany关系。您只需像上面的示例一样使用即可。但是,此类关系有一个特殊性。如果连接表有更多列,而不仅仅是外键,则可以创建一个关系模型来处理验证(假设您像之前建议的那样使用模型观察者进行验证 :) )。
更多示例即将推出。
--
使用StackEdit编写。