ccinn / repositories
Laravel Repositories 是从 bosnadev 分支出来的
0.14
2018-08-21 03:16 UTC
Requires
- php: >=5.5.9
- illuminate/console: ^5.2
- illuminate/database: ^5.2
- illuminate/filesystem: ^5.2
- illuminate/support: ^5.2
Requires (Dev)
- mockery/mockery: dev-master@dev
README
Laravel Repositories 是一个 Laravel 5 的包,用于抽象数据库层。这使得应用程序更容易维护。
安装
从您的终端运行以下命令
composer require "bosnadev/repositories: 0.*"
或将其添加到 composer.json 文件的 require 部分
"bosnadev/repositories": "0.*"
然后运行 composer update
使用方法
首先,创建您的仓库类。请注意,您的仓库类必须扩展 Bosnadev\Repositories\Eloquent\Repository
并实现 model() 方法
<?php namespace App\Repositories; use Bosnadev\Repositories\Contracts\RepositoryInterface; use Bosnadev\Repositories\Eloquent\Repository; class FilmsRepository extends Repository { public function model() { return 'App\Film'; } }
通过实现 model()
方法,您告诉仓库您希望使用哪个模型类。现在,创建 App\Film
模型
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Film extends Model { protected $primaryKey = 'film_id'; protected $table = 'film'; protected $casts = [ "rental_rate" => 'float' ]; }
最后,在控制器中使用仓库
<?php namespace App\Http\Controllers; use App\Repositories\FilmsRepository as Film; class FilmsController extends Controller { private $film; public function __construct(Film $film) { $this->film = $film; } public function index() { return \Response::json($this->film->all()); } }
可用方法
以下方法可用
Bosnadev\Repositories\Contracts\RepositoryInterface
public function all($columns = array('*')) public function lists($value, $key = null) public function paginate($perPage = 1, $columns = array('*')); public function create(array $data) // if you use mongodb then you'll need to specify primary key $attribute public function update(array $data, $id, $attribute = "id") public function delete($id) public function find($id, $columns = array('*')) public function findBy($field, $value, $columns = array('*')) public function findAllBy($field, $value, $columns = array('*')) public function findWhere($where, $columns = array('*'))
Bosnadev\Repositories\Contracts\CriteriaInterface
public function apply($model, Repository $repository)
示例用法
在仓库中创建新的电影
$this->film->create(Input::all());
更新现有的电影
$this->film->update(Input::all(), $film_id);
删除电影
$this->film->delete($id);
按 film_id 查找电影;
$this->film->find($id);
您也可以选择要获取哪些列
$this->film->find($id, ['title', 'description', 'release_date']);
通过单列标准获取单行。
$this->film->findBy('title', $title);
或者,您可以通过单列标准获取所有行。
$this->film->findAllBy('author_id', $author_id);
通过多个字段获取所有结果
$this->film->findWhere([ 'author_id' => $author_id, ['year','>',$year] ]);
标准
标准是一种简单的方法,可以将特定的条件或条件集应用到仓库查询中。您的标准类必须扩展抽象类 Bosnadev\Repositories\Criteria\Criteria
。
以下是一个简单的标准
<?php namespace App\Repositories\Criteria\Films; use Bosnadev\Repositories\Criteria\Criteria; use Bosnadev\Repositories\Contracts\RepositoryInterface as Repository; class LengthOverTwoHours extends Criteria { /** * @param $model * @param RepositoryInterface $repository * @return mixed */ public function apply($model, Repository $repository) { $model = $model->where('length', '>', 120); return $model; } }
现在,在您的控制器类中调用 pushCriteria 方法
<?php namespace App\Http\Controllers; use App\Repositories\Criteria\Films\LengthOverTwoHours; use App\Repositories\FilmsRepository as Film; class FilmsController extends Controller { /** * @var Film */ private $film; public function __construct(Film $film) { $this->film = $film; } public function index() { $this->film->pushCriteria(new LengthOverTwoHours()); return \Response::json($this->film->all()); } }
致谢
这个包在很大程度上受到了 这个优秀的包 的启发,作者是 @andersao。 这里 是我用作参考的另一个包。