定義
・ユーザーにも、記事にも、色々なテーブルに対応できるように
・vue.js , laravel を利用
・コンポーネントにして使いまわしが効くように
・redis でも考えたが、そんなにめちゃくちゃいいねされる訳じゃないし、
いいね順にソートするとき微妙かなと考えたのでmysqlで
今回は ユーザー に対し いいねできるように。
テーブルを作成
users
id,name
iines
id,foreign_key,model(varchar255),user_id,updated_at,created_at
ここまででMYSQLの設定完了
User と iine を関連付ける。
//User.id Iine の foreign_key 。さらには model が User のものを紐付ける。
public function iines()
{
return $this->hasMany('App\Iine','foreign_key')->where('model', 'User');
}
いいねをしたり、いいねしているか取得する。
//いいねを取得
public static function getIine(request $request)
{
$model = new Iine;
$model->foreign_key = $request->foreign_key;
$model->user_id = $request->user_id;
$model->model = $request->model;
$tmp = $model
->select('id')
->first();
//要素の存在チェック bool
if(!empty($tmp->id)){
$res = true;
} else {
$res = false;
}
return response()->json(['res'=> $res]);
}
//いいねを追加
public static function addIine(request $request)
{
$model = new Iine;
$model->foreign_key = $request->foreign_key;
$model->user_id = $request->user_id;
$model->model = $request->model;
$tmp = $model
->select('id')
->first();
//要素の存在チェック bool
if(!empty($tmp->id)){
$res = false;
$model
->where('id',$tmp->id)
->delete();//削除
} else {
$res = true;
$model->save();
}
return response()->json(['res'=> $res]);
}
あとは、web.phpにも動くようにルーティングを追加。
ここまででLaravel側の設定を完了。
つづいて、vue.js。
まずは、使い回しができるようにComponent化しておく。
<template>
<div>
<button v-if="flag" @click="addIine">
いいね済
</button>
<button @click="addIine" v-else>
いいね
</button>
</div>
</template>
<script>
export default {
props: ['foreign_key','user_id','model'],
data () {
return {
flag:false,
};
},
created () {
this.getIine();
},
methods: {
//足跡を追加
addIine(){
let dataform = new FormData();
dataform.append('foreign_key',this.foreign_key);
dataform.append('user_id',this.user_id);
dataform.append('model',this.model);
axios.post('/okws/addIine/', dataform).then(e => {
this.flag = e.data.res;
console.log("いいね成功");
}).catch((error) => {
console.log("エラー");
});
},
//足跡を追加
getIine(){
let dataform = new FormData();
dataform.append('foreign_key',this.foreign_key);
dataform.append('user_id',this.user_id);
dataform.append('model',this.model);
axios.post('/okws/getIine/', dataform).then(e => {
this.flag = e.data.res;
console.log("いいねできたか取得");
}).catch((error) => {
console.log("エラー");
});
},
},
}
</script>
つづいては、 Userview.vue から コンポーネントを読み出そう。
foreign_key に 訪問先ページの User.id。
user_id に 現在ログインしている User.id
model は 今回はUser
<!--500,100,'User'-->
<iine-component :foreign_key="$route.params.id" :user_id="$root.user.id" :model="model"></iine-component>
Userview.vue は app.js でルーティングを忘れずに。
ここまででいいね機能をつけることができました。
■ いいね順に並び替えよう
// 関連モデル hasmany iineをいくつ持っているか で並び替え
$res = User::withCount('iines')
->orderBy('iines_count', 'desc')
->get();
foreach ($res as $v) {
echo "記事のID : " . $v->id."<br>";
echo "いいね数 : " . $v->iines_count."<br>";
}
結果
記事のID : 10186
いいね数 : 2
記事のID : 10185
いいね数 : 1
記事のID : 0
いいね数 : 0
はい。並び替わりましたね♪