Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Eloquentとクエリビルダを両方使った実装の失敗例 - 第150回 PHP勉強会 #php...

Eloquentとクエリビルダを両方使った実装の失敗例 - 第150回 PHP勉強会 #phpstudy

ことみん / kotomin_m

March 15, 2023
Tweet

More Decks by ことみん / kotomin_m

Other Decks in Programming

Transcript

  1. @kotomin_m #phpstudy アクセサ(Laravel 5.6)
 class User extends Model
 {
 /**


    * @param string $value
 * @return string
 */
 public function getFirstNameAttribute($value)
 {
 // 復号する
 return decrypt($value);
 }
 }

  2. @kotomin_m #phpstudy class User extends Model
 {
 /**
 * ユーザの名前取得


    */
 protected function firstName(): Attribute
 {
 return Attribute::make(
 get: fn (string $value) => ucfirst($value),
 );
 }
 }
 アクセサ(Laravel 10.x)

  3. @kotomin_m #phpstudy ミューテタ(Laravel 5.6)
 class User extends Model
 {
 /**


    * @param string $value
 * @return void
 */
 public function setFirstNameAttribute($value)
 {
 // 暗号化する
 $this->attributes['first_name'] = encrypt($value);
 }
 }
 

  4. @kotomin_m #phpstudy class User extends Model
 {
 protected function firstName():

    Attribute
 {
 return Attribute::make(
 get: fn (string $value) => ucfirst($value),
 set: fn (string $value) => strtolower($value),
 );
 }
 }
 ミューテタ(Laravel 10.x)

  5. @kotomin_m #phpstudy // クエリビルダでデータベースから値を取得
 $users = DB::table('users')
 ->select('id','first_name', 'last_name')
 ->get();


    
 // EloquentのupdateOrCreate()を利用してDBを更新
 $this->userHistory->updateOrCreate(
 ['user_id' => $users->id],
 [
 'last_name' => $users->last_name,
 'first_name' => $users->first_name,
 ]
 );
 

  6. @kotomin_m #phpstudy // クエリビルダでデータベースから値を取得
 $users = DB::table('users')
 ->select('id','first_name', 'last_name')
 ->get();


    
 // EloquentのupdateOrCreate()を利用してDBを更新
 $this->userHistory->updateOrCreate(
 ['user_id' => $users->id],
 [
 'last_name' => $users->last_name,
 'first_name' => $users->first_name,
 ]
 );
 

  7. @kotomin_m #phpstudy // クエリビルダでデータベースから値を取得
 $users = DB::table('users')
 ->select('id','first_name', 'last_name')
 ->get();


    
 // EloquentのupdateOrCreate()を利用してDBを更新
 $this->userHistory->updateOrCreate(
 ['user_id' => $users->id],
 [
 'last_name' => $users->last_name,
 'first_name' => $users->first_name,
 ]
 );
 

  8. @kotomin_m #phpstudy // クエリビルダでデータベースから値を取得
 $users = DB::table('users')
 ->select('id','first_name', 'last_name')
 ->get();


    
 // EloquentのupdateOrCreate()を利用してDBを更新
 $this->userHistory->updateOrCreate(
 ['user_id' => $users->id],
 [
 'last_name' => $users->last_name,
 'first_name' => $users->first_name,
 ]
 );
 
 getメソッドは、クエリの結果を含む 
 Illuminate\Support\Collection 
 インスタンスを返す

  9. @kotomin_m #phpstudy // クエリビルダでデータベースから値を取得
 $users = DB::table('users')
 ->select('id','first_name', 'last_name')
 ->get();


    
 // EloquentのupdateOrCreate()を利用してDBを更新
 $this->userHistory->updateOrCreate(
 ['user_id' => $users->id],
 [
 'last_name' => $users->last_name,
 'first_name' => $users->first_name,
 ]
 );
 
 Eloquentで使用するモデル 

  10. @kotomin_m #phpstudy // クエリビルダでデータベースから値を取得
 $users = DB::table('users')
 ->select('id','first_name', 'last_name')
 ->get();


    
 // EloquentのupdateOrCreate()を利用してDBを更新
 $this->userHistory->updateOrCreate(
 ['user_id' => $users->id],
 [
 'last_name' => $users->last_name,
 'first_name' => $users->first_name,
 ]
 );
 
 第一引数に指定したカラムのモデルが 存在していたら更新、なかったら追加す る

  11. @kotomin_m #phpstudy // クエリビルダでデータベースから値を取得
 $users = DB::table('users')
 ->select('id','first_name', 'last_name')
 ->get();


    
 // EloquentのupdateOrCreate()を利用してDBを更新
 $this->userHistory->updateOrCreate(
 ['user_id' => $users->id],
 [
 'last_name' => $users->last_name,
 'first_name' => $users->first_name,
 ]
 );
 
 ユーザ履歴テーブル(user_history)の 
 user_idと$users->idが一致するモデルが あれば更新、なかったら追加する 

  12. @kotomin_m #phpstudy // クエリビルダでデータベースから値を取得
 $users = DB::table('users')
 ->select('id','first_name', 'last_name')
 ->get();


    
 // EloquentのupdateOrCreate()を利用してDBを更新
 $this->userHistory->updateOrCreate(
 ['user_id' => $users->id],
 [
 'last_name' => $users->last_name,
 'first_name' => $users->first_name,
 ]
 );
 

  13. @kotomin_m #phpstudy // クエリビルダでデータベースから値を取得
 $users = DB::table('users')
 ->select('id','first_name', 'last_name')
 ->get();


    
 // EloquentのupdateOrCreate()を利用してDBを更新
 $this->userHistory->updateOrCreate(
 ['user_id' => $users->id],
 [
 'last_name' => $users->last_name,
 'first_name' => $users->first_name,
 ]
 );
 
 ミューテタが使われるので、暗号化されて 保存

  14. @kotomin_m #phpstudy // クエリビルダでデータベースから値を取得
 $users = DB::table('users')
 ->select('id','first_name', 'last_name')
 ->get();


    
 // EloquentのupdateOrCreate()を利用してDBを更新
 $this->userHistory->updateOrCreate(
 ['user_id' => $users->id],
 [
 'last_name' => $users->last_name,
 'first_name' => $users->first_name,
 ]
 );
 
 クエリビルダで取得しているので、アク セサが使われない
 →複合されていない名前を取得してい る

  15. @kotomin_m #phpstudy // クエリビルダでデータベースから値を取得
 $users = DB::table('users')
 ->select('id','first_name', 'last_name')
 ->get();


    
 // EloquentのupdateOrCreate()を利用してDBを更新
 $this->userHistory->updateOrCreate(
 ['user_id' => $users->id],
 [
 'last_name' => $users->last_name,
 'first_name' => $users->first_name,
 ]
 );
 
 すでに暗号化された状態のデータを さらに暗号化して保存 

  16. @kotomin_m #phpstudy // クエリビルダでデータベースから値を取得
 $users = DB::table('users')
 ->select('id','first_name', 'last_name')
 ->get();


    
 // EloquentのupdateOrCreate()を利用してDBを更新
 $this->userHistory->updateOrCreate(
 ['user_id' => $users->id],
 [
 'last_name' => $users->last_name,
 'first_name' => $users->first_name,
 ]
 );
 
 失敗→二重で暗号化されてデータ ベースに保存されていた