{"id":2521,"date":"2015-06-23T23:06:24","date_gmt":"2015-06-23T15:06:24","guid":{"rendered":"http:\/\/blog.turn.tw\/?p=2521"},"modified":"2015-06-23T23:11:18","modified_gmt":"2015-06-23T15:11:18","slug":"%e8%83%96%e8%83%96-model-%e7%9a%84%e6%b8%9b%e9%87%8d%e6%96%b9%e6%b3%95%ef%bc%9arepository","status":"publish","type":"post","link":"https:\/\/blog.turn.tw\/?p=2521","title":{"rendered":"\u80d6\u80d6 Model \u7684\u6e1b\u91cd\u65b9\u6cd5\uff1aRepository"},"content":{"rendered":"<p>\u958b\u767capplication\u5e38\u5e38\u8981\u5c0d\u8cc7\u6599\u5eab\u505a\u5404\u7a2e\u4e0d\u540c\u689d\u4ef6\u7684\u67e5\u8a62\u3002<\/p>\n<p>\u9019\u985e\u7684\u67e5\u8a62code\u5f88\u5bb9\u6613\u5230\u8655\u91cd\u8907\u3002<\/p>\n<p>\u4ee5 Laravel Eloquent\u4f86\u8aaa\uff0ccontroller\u5f88\u5bb9\u6613\u51fa\u73fe\u9019\u6a23\u7684code\uff1a<\/p>\n<pre>\r\n$users = User::where('votes', '>', 100)\r\n                        ->whereGender('W')\r\n                        ->orderBy('created_at')\r\n                        ->get();\r\n<\/pre>\n<p>\u9019\u6bb5\u300c\u53d6\u51fa\u53d7\u6b61\u8fce\u7684\u5973\u6027\u4f7f\u7528\u8005\u300d\u7684code\uff0c\u5728\u4e2d\u5c0f\u578bapplication\u9084\u53ef\u4ee5\u63a5\u53d7\uff0c<\/p>\n<p>\u4e00\u65e6\u898f\u6a21\u7a0d\u5927\u5c31\u6703\u5728\u4e0d\u540ccontroller\u5230\u8655\u91cd\u8907\uff08duplicate\uff09\u3002<\/p>\n<p>\u5229\u7528\u5167\u5efa\u7684query scope\u529f\u80fd\uff0c\u96d6\u7136\u80fd\u5920\u7a0d\u5fae\u6539\u5584\uff0c\u4f46\u9084\u662f\u4e0d\u5920\uff1a<\/p>\n<pre>\r\n$users = User::popular()->women()->orderBy('created_at')->get();\r\n<\/pre>\n<p>\u4e0d\u53ea\u5982\u6b64\uff0c\u9084\u6703\u8b93model\u88e1\u9762\u591a\u51fa\u5b9a\u7fa9query scope\u7684\u7a0b\u5f0f\u78bc\uff0c\u5c0e\u81f4model\u8b8a\u80d6\uff1a<\/p>\n<pre>\r\nclass User extends Eloquent {\r\n\r\n    public function scopePopular($query)\r\n    {\r\n        return $query->where('votes', '>', 100);\r\n    }\r\n\r\n    public function scopeWomen($query)\r\n    {\r\n        return $query->whereGender('W');\r\n    }\r\n\r\n}\r\n<\/pre>\n<p>\u9019\u7a2e\u6642\u5019\uff0c\u9069\u5408\u5beb\u4e00\u500bRepository\u9032\u884c\u5c01\u88dd\uff1a<\/p>\n<pre>\r\nclass UserRepository\r\n{\r\n    public function getPopularWomen()\r\n    {\r\n        return User::where('votes', '>', 100)->whereGender('W')->orderBy('created_at')->get();\r\n    }\r\n}\r\n<\/pre>\n<p>\u5b83\u6703\u8b93controller\u5167\u7684code\u7c21\u6f54\u3001\u53ef\u8b80\u8a31\u591a\uff1a<\/p>\n<pre>\r\n$repository = new UserRepository();\r\n\r\n$users = $repository->getPopularWomen();\r\n<\/pre>\n<p>\u5982\u679c\u60a8\u662f Laravel \u4f7f\u7528\u8005\uff0c\u9019\u7a2e\u642d\u914dAutomatic Resolution\u7684\u5beb\u6cd5\u4e00\u5b9a\u7d93\u5e38\u770b\u5230\uff1a<\/p>\n<pre>\r\nclass UserController extends BaseController\r\n{\r\n    protected $users;\r\n    \r\n    public function __construct(UserRepository $repository)\r\n    {\r\n        parent::__construct();\r\n        \r\n        $this->users = $repository;\r\n    }\r\n    \r\n    public function getIndex()\r\n    {\r\n        $women = $this->users->getPopularWomen();\r\n    }\r\n}\r\n<\/pre>\n<p>\u751a\u81f3\u53ef\u4ee5\u5beb\u4e00\u500b\u5171\u7528\u7684abstract class\u6e1b\u5c11duplicate code\uff1a<\/p>\n<pre>\r\n<?php\r\nuse Illuminate\\Database\\Eloquent\\Model;\r\nuse Illuminate\\Database\\Eloquent\\Collection;\r\n\r\nabstract class EloquentRepository\r\n{\r\n    protected $model;\r\n    \r\n    public function __construct($model = null)\r\n    {\r\n        $this->model = $model;\r\n    }\r\n    \r\n    public function getById($id)\r\n    {\r\n        return $this->model->find($id);\r\n    }\r\n    \r\n    public function getAll()\r\n    {\r\n        return $this->model->all();\r\n    }\r\n\r\n    public function save($data)\r\n    {\r\n        if ($data instanceOf Model) {\r\n            return $this->storeEloquentModel($data);\r\n        }\r\n    }\r\n    \r\n    public function saveMany($collection)\r\n    {\r\n        foreach($collection as $model)\r\n        {\r\n            $this->storeEloquentModel($model);\r\n        }\r\n    }\r\n\r\n    public function delete($model)\r\n    {\r\n        return $model->delete();\r\n    }\r\n\r\n    protected function storeEloquentModel($model)\r\n    {        \r\n        if ($model->getDirty()) {\r\n            return $model->save();\r\n        } else {\r\n            return $model->touch();\r\n        }\r\n    }\r\n\r\n}\r\n\r\n<\/pre>\n<p>\u900f\u904eRepository\u5c01\u88dd\u9084\u6709\u4e00\u500b\u597d\u8655\uff1a<\/p>\n<p>\u6e2c\u8a66controller\u6216\u662fservice\u7684\u6642\u5019\u53ef\u4ee5\u62bd\u63db\u6389Repository\uff0c\u8b93\u6e2c\u8a66\u6642\u4e0d\u7528\u78b0\u5230\u8cc7\u6599\u5eab\uff01<\/p>\n<p>\u4e0b\u6b21\u4f60\u7684application\u5305\u542b\u5927\u91cfquery logic\u6642\uff0c\u4e0d\u59a8\u8a66\u8a66\u770b\u9019\u500b\u4f5c\u6cd5\u3002<\/p>\n<p>(Photo via <a href=\"https:\/\/www.flickr.com\/photos\/infomastern\/\">Susanne Nilsson<\/a>, CC licensed)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u958b\u767capplication\u5e38\u5e38\u8981\u5c0d\u8cc7\u6599\u5eab\u505a\u5404\u7a2e\u4e0d\u540c\u689d\u4ef6\u7684\u67e5\u8a62\u3002 \u9019\u985e\u7684\u67e5\u8a62code\u5f88\u5bb9\u6613\u5230\u8655\u91cd\u8907\u3002 \u4ee5 Lar &hellip; <a href=\"https:\/\/blog.turn.tw\/?p=2521\" class=\"more-link\">\u7e7c\u7e8c\u95b1\u8b80 <span class=\"screen-reader-text\">\u80d6\u80d6 Model \u7684\u6e1b\u91cd\u65b9\u6cd5\uff1aRepository<\/span> <span class=\"meta-nav\">&rarr;<\/span> <\/a><\/p>\n","protected":false},"author":1,"featured_media":2514,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_mi_skip_tracking":false},"categories":[2],"tags":[8,14,19,36],"_links":{"self":[{"href":"https:\/\/blog.turn.tw\/index.php?rest_route=\/wp\/v2\/posts\/2521"}],"collection":[{"href":"https:\/\/blog.turn.tw\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.turn.tw\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.turn.tw\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.turn.tw\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2521"}],"version-history":[{"count":10,"href":"https:\/\/blog.turn.tw\/index.php?rest_route=\/wp\/v2\/posts\/2521\/revisions"}],"predecessor-version":[{"id":2533,"href":"https:\/\/blog.turn.tw\/index.php?rest_route=\/wp\/v2\/posts\/2521\/revisions\/2533"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.turn.tw\/index.php?rest_route=\/wp\/v2\/media\/2514"}],"wp:attachment":[{"href":"https:\/\/blog.turn.tw\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2521"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.turn.tw\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2521"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.turn.tw\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2521"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}