ã¡ãã£ã¨æ
ãããã¾ãã¦ããã¥ã¼ãã¿ã«ã¤ãã¦ã¡ãã£ã¨æ°ã«ãªãäºããã£ãã®ã§èª¿ã¹ã¦ã¿ã¾ããã
Laravelã®ãã¼ã¸ã§ã³ã¯8ã§æ¤è¨¼ãã¦ã¾ãããå¤åã¾ãã©ã®ãã¼ã¸ã§ã³ã§ããã»ã©ã®å·®ç°ã¯ãªãããããªããã¨(æ°ããçããã¡ã½ãããé¤ã)ã
ãã¥ã¼ãã¿ã«ã¤ãã¦ã¯ä¾ãã° https://readouble.com/laravel/8.x/ja/eloquent-mutators.html ãããããã¼ã¹ã«ã
æ©è½ã¯è²ã
ããã®ã§ãããä¸ç«¯ãgetï¼Attribute() ã¨setï¼Attribute() ãè¦ã¦ãã¾ãã
åºæ¬æ©è½ã«ã¤ãã¦ã®åºæ¬æ
å ±ã¯å
¬å¼ãµã¤ããåèã«ãã¦ããã ãã¤ã¤ã
å¤åä¸ã¤ããã®è¾ºã¯æ³å®ãã¦ãããã ãããªããã¨ããã®ãããæ¢åã®ã«ã©ã ãå å·¥åæãã¦ãã¼ã¿ãåå¾ãããããããªããããªãããããã¨ã
ããã¥ã¢ã«ã§ããã¦ã¼ã¶ã¼ã®ãã«ãã¼ã ã®åå¾ãã¨ããé¢¨ã«æ¸ããã¦ãã¾ããããã®è¾ºã¯ã¾ãå²ã¨ããã£ãã便å©ãã£ã¦æã人ãå¤ãããããªããããã¨æãã¾ãã
ããã¥ã¢ã«ã ã¨ãããªæãã§ããã
/** * ã¦ã¼ã¶ã¼ã®ãã«ãã¼ã ã®åå¾ * * @return string */ public function getFullNameAttribute() { return "{$this->first_name} {$this->last_name}"; }
ãããæ¸ãã¦ããã¨ãããã¥ã¢ã«ã«ã¯æ¸ãã¦ã¾ãããã大ä½ãããªæãã§åå¾ã§ãã¾ãã
use App\Models\User; $user = User::find(1); $fullName = $user->full_name;
ãªãã¨ãªã便å©ã ãªããã¨ããããããªã®ã§ããã
ã¡ããã¨æ°ã«ãªã£ãã®ããåå¨ããªãã«ã©ã ãã ããããªãã¦ãåå¨ããã«ã©ã ãã«å¯¾ãã¦ãgetãsetãæ¸ãäºãã§ãã¾ãã
ãã®è¾ºã§ãããã¤ãå®é¨ãã¦ã¿ãã®ã§ããã®è¾ºãè¨é²ãã¦ãããã£ã¦ã®ããã®è¨äºã®ç®çã§ãã
ä¸ç«¯ã¾ããå§ã¨åãã¨å¾ã§ä½¿ãæååãç¨ã®ãéãªãã¼ãã«ãç¨æãã¾ããã
MariaDB [lara_test]> insert tests set first_name='aaa',last_name='bbb', val='val'; Query OK, 1 row affected (0.01 sec) MariaDB [lara_test]> select * from tests; +----+------------+-----------+-----+------------+------------+ | id | first_name | last_name | val | created_at | updated_at | +----+------------+-----------+-----+------------+------------+ | 1 | aaa | bbb | val | NULL | NULL | +----+------------+-----------+-----+------------+------------+ 1 row in set (0.00 sec)
ã¨ããããã¾ããä¸è¿°ã®éããåå¨ããªãã«ã©ã åãæå®ãã¦åæããå¤ã®åå¾ããããã£ããã¨æ¸ãã¦ã¿ã¾ãã
ãã©ã®ã³ã¼ããã©ãã«æ¸ããã¦ãããããªã©ã¯é©å®æ¨æ¸¬ãã¦ãã ãã(ã³ã¡ã³ãã¨ãã§çªã£è¾¼ã¿ãå¤ãã£ãã綺éºã«æ¨æ²ãã¾ãï½)ã
// Route::get('/test', [TestController::class, 'index']);
resources/views/tests.blade.php
public function getNameAttribute() { echo "Trap getNameAttribute\n"; return "{$this->first_name} {$this->last_name}"; }
public function index() { // $data = TestModel::find(1); var_dump($data->name);
ã¾ããããªæãã§ãåå¾ãã§ãã¾ãã
ãã¦ãããããã
public function getFirstNameAttribute() { echo "Trap getFirstNameAttribute\n"; return $this->first_name; }
ãããæ¸ãã¨ãããªé¢¨ã«è¨ããã¾ãã
ErrorException: Undefined property: App\Models\Test::$first_name in file
ããã¯ããããªé¢¨ã«æ¸ãå¿ è¦ãããããã§ãã
public function getFirstNameAttribute() { echo "Trap getFirstNameAttribute\n"; return $this->attributes['first_name']; //return $this->first_name; }
$attributesããããã£ã¯ããã¥ã¢ã«ã«ãæ¸ãã¦ããã®ã§ãåºæ¬çã«ãã¥ã¼ãã¿å ã§ã¯ $attributes ã使ããã£ã¦ã®ãããããæãã®ããã§ãã
public function getAll() { return $this->attributes ; }
ãªãã¦ã®ãModelã«çããã¨å¤é¨ãããçãã¼ã¿ãä¸éããåããã®ã§ãä»åã®ãããªå®é¨ã®æã«ã¯ä¾¿å©ããã¨ã
ãã¦ã
ããã¾ãgetãå¤å°æ°ã«ãªãäºããªãããã§ã¯ãªãã®ã§ãããsetã®ã»ãã§ãããã¡ãã£ã¨æ°ã«ãªãäºããã£ã¦ã
ã¾ãã¯ãããªãã®ãç¨æãã¾ãã
public function setValAttribute($v) { $this->attributes['val'] = strtoupper($v); }
ãããæ¸ãã¨ãvalã®å¤ã¯å
¨é¨å¤§æåã«ãªã(äºãæå¾
ãã¦ãã)ãã¨æããããã§ããããã¦ã¯ã¦ã
Modelã«ã¬ã³ã¼ããå
¥ããæã¯ãsave()ãcreate()ãinsert(åä½)ãinsert(ãã«ã¯)ãLaravel8ãããããã¯upsert()ãªãã¦ã®ããããã¾ãã
ã£ã¤ããã§ãæ©éã
// TestModel::create([ 'first_name' => 'create', 'last_name' => 'create', 'val' => 'aBcDe', ]); // $o = new TestModel(); $o->fill([ 'first_name' => 'save', 'last_name' => 'save', 'val' => 'aBcDe', ]); $o->save(); // TestModel::insert([ 'first_name' => 'insert', 'last_name' => 'insert', 'val' => 'aBcDe', ]); // TestModel::insert([ [ 'first_name' => 'bulk insert', 'last_name' => 'bulk insert', 'val' => 'aBcDe', ], [ 'first_name' => 'bulk insert2', 'last_name' => 'bulk insert2', 'val' => 'aBcDe', ], ]); // TestModel::upsert([ [ 'first_name' => 'bulk upsert', 'last_name' => 'bulk upsert', 'val' => 'aBcDe', ], [ 'first_name' => 'bulk upsert2', 'last_name' => 'bulk upsert2', 'val' => 'aBcDe', ], ], ['id']);
MariaDB [lara_test]> select * from tests; +----+--------------+--------------+-------+---------------------+---------------------+ | id | first_name | last_name | val | created_at | updated_at | +----+--------------+--------------+-------+---------------------+---------------------+ | 1 | aaa | bbb | val | NULL | NULL | | 2 | create | create | ABCDE | 2022-03-25 05:16:54 | 2022-03-25 05:16:54 | | 3 | save | save | ABCDE | 2022-03-25 05:16:54 | 2022-03-25 05:16:54 | | 4 | insert | insert | aBcDe | NULL | NULL | | 5 | bulk insert | bulk insert | aBcDe | NULL | NULL | | 6 | bulk insert2 | bulk insert2 | aBcDe | NULL | NULL | | 7 | bulk upsert | bulk upsert | aBcDe | 2022-03-25 05:16:54 | 2022-03-25 05:16:54 | | 8 | bulk upsert2 | bulk upsert2 | aBcDe | 2022-03-25 05:16:54 | 2022-03-25 05:16:54 | +----+--------------+--------------+-------+---------------------+---------------------+ 8 rows in set (0.00 sec)
ããã¾ãäºæ³éãã£ã¡ããäºæ³éãã
ãcreateã¨saveãã¯setãéããããªã®ã§ãããinsertã¨upsertã¯ãsetãéããªããã
å¤åãcreateã¨saveã¯åºæ¬çã«ãEloquentã«æå±ãã¦ãããã®ã«å¯¾ãã¦ãinsertã¨upsertã¯ãããããã¯ã¨ãªãã«ãã«æå±ãã¦ããããã ãããªããã¨ã
ãã¨ãããããselectãã¦ããå¤ãã¤ã³ã¹ã¿ã³ã¹ã«å ¥ããæã«ã¯setã¯éãã®ãï¼ãã£ã¦ã®ãä¸å¿ç¢ºèªã
public function index() { // $data = TestModel::find(8); var_dump($data->name); var_dump($data->getAll()); $data->sss('aBc'); var_dump($data->getAll()); } public function sss($v) { //$this->val = $v; $this->attributes['val'] = $v; }
Trap getNameAttribute Trap getFirstNameAttribute string(25) "bulk upsert2 bulk upsert2" Trap getFirstNameAttribute string(12) "bulk upsert2" array(6) { ["id"]=> int(8) ["first_name"]=> string(12) "bulk upsert2" ["last_name"]=> string(12) "bulk upsert2" ["val"]=> string(5) "aBcDe" ["created_at"]=> string(19) "2022-03-25 05:16:54" ["updated_at"]=> string(19) "2022-03-25 05:16:54" } Trap getFirstNameAttribute string(12) "bulk upsert2" array(6) { ["id"]=> int(8) ["first_name"]=> string(12) "bulk upsert2" ["last_name"]=> string(12) "bulk upsert2" ["val"]=> string(3) "aBc" ["created_at"]=> string(19) "2022-03-25 05:16:54" ["updated_at"]=> string(19) "2022-03-25 05:16:54" }
ããã¾ãã ãããªãã
ãã¨ã¤ãã§ã«ã
public function setValAttribute($v) { $this->val = 'hoge'; }
ããããã¨ãã¨ã©ã¼ã¯åºãªããã©åããªããã¨ãªãã¾ãã
ãªãã¨ãªããªã«ãèµ·ãã¦ããï¼ ã¯æ³åã§ããããªæãã§ã¯ããã¾ããã
ãã¦ããããããã¡ããã®ææ³ã
ãåå¨ããªãã«ã©ã å¤ã®getãã¯ãããã¾ãããããæç¤ºçã«ã¡ã½ããæ¸ããã»ãããããªãï¼ãã¨ã¯æããã ãã©ãã¾ããããã£ã¡ããã¢ãªã¨è¨ããªãããªããããªããã¨ã
ãåå¨ããã«ã©ã å¤ã®getãã¯ãããããå¾®å¦ã䏿¹ã§ãå å·¥ããå¤ã欲ãããæ°æã¡ã¯ãããã®ã§ãããããã¡ããã¯EloquentããORMãã¨æã£ã¦ããã®ã§ãã ã¨ããã¨ãåºæ¬çã«ã¯ãçæ
å ±ãè¿ããã£ã¦æããã§ããããããå å·¥ããæ
å ±ãæ¬²ãããªããããç¨ã®ã¡ã½ãããçãããçãªããã ã¾ããã·ã¼ã ã¬ã¹ã«åããããæ°æã¡ãå
¨ãããããªãããã§ããªããã®ã§ãå¾®å¦ã
setã«ã¤ãã¦ã¯ãããã¡ããã¯åºæ¬ãããã¾ãããé¡ã¯ããªããªããã¨ã
䏿¹ã§ã便å©ãã ã£ããããã®ã¯ãªãã¨ãªãããããã ãã©ããã䏿¹ã§ãé è½ãå¤ãã¨ããã®è¾ºã"ããã£ã¦ãªã"人ãããããã確çãå¢ãã¦ãããâ¦â¦â¦â¦â¦ã
ãªã®ã§ã¾ããå¼·å¼ããµãã£ã¦æ¢ãããã£ã¦ã»ã©ã§ã¯ãªãã®ã§ãããããã¾ãç©æ¥µçã«å¥½å°è±¡ã£ã¦ããã§ããªãããªããã
ã¨ããããã§ãããã¾ããã¸ãã£ããªå 容ã«ã¯ãªãããã£ããã§ããããã£ãã調ã¹ããã§ãã¡ã¢ãå ¼ãã¦ã