在保存

时间:2015-05-29 08:21:18

标签: php laravel laravel-5

我正在尝试从表单中删除所有空字段(使用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)没有影响;我想我只是遗漏了一些明显的东西,我的[当前]隧道视觉不会让我看到。

2 个答案:

答案 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()