waavi/model

此包最新版本(1.0)的许可信息不可用。

在保存和更新时具有自动验证的Eloquent模型。

1.0 2013-12-03 17:38 UTC

This package is auto-updated.

Last update: 2024-09-13 23:29:08 UTC


README

WaaviModel 受到Eloquent的Ardent和Aware模型验证器的启发。以下功能提供:

- Allows Laravel to query related models.
- AutoValidate on model save.
- Allows for unique constraint in validation rules to auto ignore the current model when updating
- Flashes input data when a save fails.

设置

编辑 composer.json

"require": {
	"waavi/model": "dev-master"
},

模型必须扩展 Waavi\Model\WaaviModel 类

<?php

	use Waavi\Model\WaaviModel;

	class MyModel extends WaaviModel {

		...

	}

验证

WaaviModel 使用 Laravel 的 Validator 类,因此验证规则、自定义消息和自定义验证方法都是可用的。

use Waavi\Model\WaaviModel;

class Post extends WaaviModel {

	protected $table = 'posts';

	/**
   * Validation rules
   *
   * @var array
   */
  public $rules = array(
  	'title'	=> 'required|between:5,160',
  	'slug'	=> 'required|unique:posts',
  	'text'	=> 'required',
  );

  /**
   * Validation custom messages
   *
   * @var array
   */
  public $rules = array(
  	'required' => 'The :attribute field is required.',
  );
}

所有 Laravel 的验证规则都是可用的,以及您设置的任何自定义验证规则。在保存模型时,验证会自动运行。可以通过 $model->errors() 获取验证错误。使用示例

	$input = Input::all();
	$success = Post::fill($input)->save();
	if ($success) {
		return Redirect::route('...');
	} else {
		return Redirect::route('...')->withErrors($article->errors());
	}

如果您想跳过验证,可以使用 $model->forceSave();。您可以使用 $model->isValid(); 在保存之前检查模型是否有效

可以在运行时使用以下方式访问和修改规则

$rules = array('title'	=> 'required|between:5,160');

$model->getRules();                                 // Returns the model's validation rules.
$model->setRules($rules);                           // Switches the model's validation rules
$model->setRule('slug', 'required|unique:posts');   // Adds or replaces a validation rule
$$model->removeRule('text');                        // Removes rules for a field

自定义消息的访问方式相同

$messages = array('required'	=> 'The :attribute field is required.');

$model->getCustomMessages();                                    // Returns the model's custom messages.
$model->setCustomMessages($messages);                           // Switches the model's custom messages.
$model->setCustomMessage('required', ':attribute is required'); // Adds or replaces a custom messages.
$$model->removeCustomMessage('required');                       // Removes a custom message.

查询相关模型

WaaviModel 扩展了 Eloquent 查询相关模型的能力。这在必须动态构建查询并需要访问相关模型中的值时很有用。

让我们通过一个例子来说明。假设您有以下模型

class User extends WaaviModel {
	public function posts() {
		return $this->hasMany('Post');
	}
}

class Post extends WaaviModel {
	public function author() {
		return $this->belongsTo('User');
	}
	public function comments() {
		return $this->hasMany('Comment');
	}
	public function tags() {
		return $this->hasMany('Comment');
	}
}

class Tag extends WaaviModel {
	public function posts() {
		return $this->hasMany('Post');
	}
}

class Comment extends WaaviModel {
	public function post() {
		return $this->belongsTo('User');
	}
}

假设您想获取所有名为John或Jane的用户创建的、被标记为'News'的文章。使用Eloquent来做这个很难,但使用WaaviModel您有另一个选择。您可以通过调用 whereRelated($relationshipName, $column, $operator, $value) 来过滤结果

$posts = Post::whereRelated('tags', 'value', '=', 'News')
  ->whereRelated(function($query)
  {
    $query->whereRelated('author', 'name', '=', 'John')
      ->orWhereRelated('author', 'name', '=', 'Jane');
	})
  ->get();

如果您想获取所有不是由名为John的人发布的文章,这同样简单。

$posts = Post::whereNotRelated('author', 'name', '=', 'John')->get()

那么获取由John发布的所有文章的评论怎么办呢?

$comments = Comment::whereRelated('post.author', 'name', '=', 'John')->get()

WaaviModel 支持Eloquent支持的所有关系,包括 MorphOne 和 MorphMany。可用的过滤器列表如下

WaaviModel::whereRelated($relationshipName, $column, $operator, $value);

WaaviModel::orWhereRelated($relationshipName, $column, $operator, $value);

WaaviModel::whereNotRelated($relationshipName, $column, $operator, $value);

WaaviModel::orWhereNotRelated($relationshipName, $column, $operator, $value);

闭包以及深层次的关系也得到支持,正如您在前面的示例中看到的。但是,子查询目前还不支持,并且必须指定 $column、$operator 和 $value,除非使用闭包。

whereRelated 方法的调用在内部编译为 whereIn、whereNotIn 或 whereNull(当没有记录满足约束时)。为此,每次调用都会查询数据库以查看哪些记录符合指定的约束。这有几个缺点

- Most common databases allow for a limited number of elements (around 10.000) in whereIn clauses. Laravel has the same limitation when using eager loading, which is done in the same way.
- Each whereRelated call queries the database separately, so heavy use will impact performance.