首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在保存之前从Laravel模型中剥离空属性

在保存之前从Laravel模型中剥离空属性
EN

Stack Overflow用户
提问于 2015-05-29 08:21:18
回答 2查看 2.1K关注 0票数 3

我试图从表单中删除所有被提交到我的数据库中的空字段(使用Moloquent扩展雄辩)。

我有个基本模型:

代码语言:javascript
复制
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;
    });
  }
}

然后将其扩展:

代码语言:javascript
复制
class MyModel extends Base{
  public static function boot(){
    parent::boot()
  }
}

但是它对子类(MyModel)没有任何影响;我想我只是遗漏了一些显而易见的东西,而我目前的隧道愿景是不会让我看到的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-01 08:33:30

对于其他寻找解决方案的人,我设置了一个中间件来删除所有的空输入字段,然后在保存方法中也这样做。

代码语言:javascript
复制
/* 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

代码语言:javascript
复制
/* 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(),或者在任何其他方法中调用父方法。对我起作用的方法:

代码语言:javascript
复制
/* 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-operationshttps://github.com/jenssegers/laravel-mongodb#mongodb-specific-operations

票数 0
EN

Stack Overflow用户

发布于 2015-05-30 05:41:19

Eloquent的基本模型有一个名为setRawAttributes的方法:

代码语言:javascript
复制
/**
 * 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扩展了这个类,或者有这样的方法,您可以在过滤属性数组之后使用它,例如:

代码语言:javascript
复制
$model->setRawAttributes(array_filter($model->getAttributes()));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30524638

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档