Vuex state を form に使うとき、入力と同時に state が更新されてしまう問題

環境:

vue@2.6.14

vuex@3.6.2

 

<v-text-fileld v-model=$store.state.userData.nickname></v-text-field>

 

このように state をバインドすると値が入力するたびに stateが更新されるため、フォームが submit されようと cancel されようと関係なく submit 扱いになってしまう。

 

solution)

フォームで編集したいデータを値渡しで格納する state を作成する。

const state = {

  userData: {nickname: '太郎', age: 20},

  form: {}   <<<<  値渡し格納用

}

const mutations = {

  'SET_FORM_DATA'(state, payload) {

    state.form = payload

  }

}

 

let data = this.$store.state.userData

let temp = JSON.stringfy(data)

temp = JSON.parse(temp)

 

this.$store.commit('SET_FORM_DATA', temp) 

 

<v-text-fileld v-model=$store.state.form.nickname></v-text-field>

 

ref:

www.sejuku.net

Laravel + mongoDB find deepley nested collection with array

環境:

laravel@8.79.0

Jenssegers/mongodb@3.8.4

 

サーチ対象の model 構造は以下とする

 

Order

{

  _id: ********,

  shippingStatus: [

    "status" => "発送完了",

    "shippingMethod" => "クロネコヤマト",

    "inquiryNumber" => "11111111"

  ]

}

 

Order model から shippingStatus['status'] が"発送完了" なものを検索したいとする。

*** shippingStatus の中身が配列であることに注意

Order::where(['shippingStatus.status' => '発送完了'])->get();

Laravel: 親モデルを削除と同時に子モデルを削除する cascading soft-delete / MySQL case and MongoDB case

環境:

Laravel@8.79.0

Jenssegers/mongodb@3.8.4

 

前提:

親モデル >>> User.php

MySQL子モデル >>> Post.php

MongoDB子モデル >>> ProfileDetail.php

 

case MySQL

  • soft-delete に対応させる

migration file に以下を加筆

Schema::create('users', function Blueprint $table) {

  $table->softDeletes();

  ...

}

Schema::create('posts', function Blueprint $table) {

  $table->softDeletes();

  ...

}

 
  • model を編集

composer require askedio/laravel-soft-cascade

github.com

@config/app.php

Askedio\SoftCascade\Providers\GenericServiceProvider::class,

@models/User.php

use Illuminate\Database\Eloquent\SoftDeletes;

class User extends Model {
  use SoftDeletes;

  use \Askedio\SoftCascade\Traits\SoftCascadeTrait;

 

  protected $softCascade = ['posts'];   // cascading soft-delete 対象の model を登録

}    

@model/Posts.php

use Illuminate\Database\Eloquent\SoftDeletes;

class Post extends Model {
  use SoftDeletes:

}

 

確認

php artisan tinker

$user = User::first()

$posts = $user->posts()->get()

$user->delelte()

  >>> $user の deleted_at column に値が入り soft-delete 状態になる

$user->post()->get()

  >>> null

$posts

  >>> 先に取得した$posts の値を返す (データを消去したわけではないので先に変数として取得していれば値を返す。この際、deleted_at column は users と違い、値は入らずブランクのまま)

$user->restore()

  >>> deleted_at column がブランクになる

$user->posts()

  >>> 値を返すようになる

 

case MongoDB

  • soft-delete に対応させる

migrarion file に以下を追記

Schema::create('users', function Blueprint $table) {

  $table->softDeletes();

  ...

}

  • model を編集

@model/ProfileDetail.php

use Moloquent;

use Jenssegers\Mongodb\Eloquent\SoftDeletes;

 

class ProfileDetail extends Moloquent {

  use SoftDeletes;

  protected $dates = ['deleted_at'];

}

github.com

  • cascade delete に対応させる

laravel-soft-cascade が mongoDB に対応していないのでマニュアルでuser が delete された場合、子モデルも delete されるようにする

@model/User.php

以下を加筆 【boot をオーバーライド】

public static function boot() {

  parent::boot();

  static::deleted(function ($user) {

    $user->profileDetail()->delete();

  });

  static::restored(function ($user)) {

    $user->profileDetail()->restore();

  }

}

 

確認

php artisan tinker

$user = User::first()

$profileDetail = $user->profileDetail()->get()

$user->delete()

$user->profileDetal()->get()

  >>> null

$user->restore()

$user->profileDetal()->get()

  >>> 値を返す

 

ref:

yaba-blog.com

 

Laravel MongoDB: mongodbを使用時にmigration file で table を定義する

環境

Laravel@8.79.0

Jenssegers/mongodb@3.8.4

 

migration をしなくても ORM から query することで DB に table を作成することができるが、 migration file を作って DB table を定義したい場合、

php artisan make:migration create_MONGO_TABLE_MODEL_table

 

public function up() {

  Schema::connection('mongodb')->create('MONGO_TABLE_NAME', function(Blueprint $table)) {

  //

  }

}

 

connection('mongodb') で接続先DBを指定

Laravel MongoDB: Delete a table and items manually

環境

Laravel@8.79.0

Jenssegers/mongodb@3.8.4

php artisan tinker

  >>> @tinker session

    // Delete a table

    Schema::connection('mongodb')->drop('TABLE_NAME')

    // Delete items

    DB::connection('mongodb')->table('TABLE_NAME')->truncate()

 

ref:

stackoverflow.com

Laravel と Vuejs の連携 laravel 側の データを vuejs template 内で使用する

Updated: 2024_02_16

 

環境:

laravel@8.79.0

vue@2.6.14

 

@app.blade.php

 

<div id="vue">

  <app-pageBody :passing-data="`{{ Sesssion::get('passingData'); }}`"></app-pageBody>

必ずバッククォート``で囲う

</div>

 

@someController.php

  session()->put('passingData', "Hello this is a passing data");

 

@PageBody.vue

  props: ['passingData']

  this.passingData でLaravel側のデータを受け取り可能になる

 

このとき blade template 内で props name をケバブケースにしないとvueにpropsをパスできないことに注意。キャメルケースはダメ。