我正在尝试从表单中删除所有空字段(使用Mongo - Moloquent extends Eloquent)。
我有一个基本模型:
class Base extends Moloquent {
public static function boot(){
parent::boot();
static::saving( function($model){
$arr = $model->toArray();
$removed = array_diff($arr, array_filter($arr));
foreach($removed as $k => $v) $model->__unset($k);
return true;
});
}
}
然后扩展它:
class MyModel extends Base{
public static function boot(){
parent::boot()
}
}
但它对子类(MyModel)没有影响;我想我只是遗漏了一些明显的东西,我的[当前]隧道视觉不会让我看到。
答案 0 :(得分:1)
Eloquent的基础模型有一个名为setRawAttributes的方法:
/**
* Set the array of model attributes. No checking is done.
*
* @param array $attributes
* @param bool $sync
* @return void
*/
public function setRawAttributes(array $attributes, $sync = false)
{
$this->attributes = $attributes;
if ($sync) $this->syncOriginal();
}
如果Moloquent扩展此类或具有这样的方法,则可以在过滤属性数组后使用它,例如:
$model->setRawAttributes(array_filter($model->getAttributes()));
答案 1 :(得分:0)
对于其他寻求解决方案的人;我设置了一个中间件来去除所有空输入字段,然后在保存方法中做同样的事情。
/* app/Http/Middleware/StripRequest.php */
use Closure;
class StripRequest {
public function handle($request, Closure $next)
{
$request->replace(array_filter($request->all()));
return $next($request);
}
}
请记住将其添加到内核$middleware
:
/* app/Http/Kernel.php */
protected $middleware = [
'Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode',
'Illuminate\Cookie\Middleware\EncryptCookies',
'Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse',
'Illuminate\Session\Middleware\StartSession',
'Illuminate\View\Middleware\ShareErrorsFromSession',
'app\Http\Middleware\StripRequest',
];
从那里我使用了与上面指定的相同的模型。只需记住在构造函数中使用parent::__construct()
或在任何其他方法中调用parent。对我有用的方法:
/* app/Models/Base.php */
static::saving(function($model){
// Clear out the empty attributes
$keep = array_filter($model->getAttributes(), function($item){ return empty($item); });
foreach($keep as $k => $v) $model->unset($k);
// Have to return true
return true;
});
我使用了https://github.com/jenssegers/laravel-mongodb#mongodb-specific-operations
中的unset()