質問編集履歴

1

編集して詳しくしました。

2019/09/30 07:19

投稿

Yuto921
Yuto921

スコア11

test CHANGED
File without changes
test CHANGED
@@ -4,6 +4,16 @@
4
4
 
5
5
 
6
6
 
7
+ 日記投稿アプリのようなものを作っています。
8
+
9
+ 現在、つまづいているところは、各投稿につけた「いいね」ボタンをajaxを使って処理するところです。
10
+
11
+ 「いいね」ボタンをクリックすると、ajaxでクリックされた投稿の「いいね」ボタンが+1され、色がつくようにしたいです。
12
+
13
+
14
+
15
+
16
+
7
17
  下が、jsファイルです。
8
18
 
9
19
  ```js
@@ -106,7 +116,7 @@
106
116
 
107
117
 
108
118
 
109
- 下が、PHPファイルです。
119
+ 下が、PHPファイル(index.blade.php)です。
110
120
 
111
121
  ```php
112
122
 
@@ -178,6 +188,364 @@
178
188
 
179
189
 
180
190
 
191
+ 下は、web.phpです。ルートの記述をしています。
192
+
193
+ ```php
194
+
195
+
196
+
197
+ // 一覧以外のページはログインしていないと表示(実行)できないように変更 ログインしていない場合リダイレクト
198
+
199
+ Route::group(['middleware' => 'auth'], function() {
200
+
201
+ Route::get('diary/create', 'DiaryController@create')->name('diary.create');
202
+
203
+ Route::post('diary/create', 'DiaryController@store')->name('diary.create');
204
+
205
+
206
+
207
+ Route::get('diary/{diary}/edit', 'DiaryController@edit')->name('diary.edit');
208
+
209
+ Route::put('diary/{diary}/update', 'DiaryController@update')->name('diary.update');
210
+
211
+
212
+
213
+ Route::delete('diary/{diary}/delete', 'DiaryController@destroy')->name('diary.destroy');
214
+
215
+
216
+
217
+ Route::post('diary/{id}/like', 'DiaryController@like');
218
+
219
+ Route::post('diary/{id}/dislike', 'DiaryController@dislike');
220
+
221
+ });
222
+
223
+
224
+
225
+ Auth::routes();
226
+
227
+ ```
228
+
229
+
230
+
231
+
232
+
233
+
234
+
235
+
236
+
237
+ 下が、DiaryController.phpでコントローラーファイルです。エラー原因要因の箇所は、下のlikeメソッドです。
238
+
239
+ ```php
240
+
241
+ <?php
242
+
243
+
244
+
245
+ namespace App\Http\Controllers;
246
+
247
+
248
+
249
+ use Illuminate\Http\Request;
250
+
251
+ use App\Diary; // App は Diary.php の namespace App; からきている
252
+
253
+ use App\Http\Requests\CreateDiary; // 認証ルールを作ったRequestファイルを読み込む
254
+
255
+
256
+
257
+ class DiaryController extends Controller
258
+
259
+ {
260
+
261
+ // プロパティ
262
+
263
+
264
+
265
+ // メソッド
266
+
267
+
268
+
269
+ // 一覧表示するメソッド
270
+
271
+ public function index()
272
+
273
+ {
274
+
275
+ // diariesテーブルのデータを全件取得
276
+
277
+ // allメソッド : 全件データを取得するメソッド Modelクラスの中に入っているから使える。extendsしている
278
+
279
+ $diaries = Diary::all(); // Diary だから、 diariesのテーブルにアクセス(この場合allメソッドを)する
280
+
281
+
282
+
283
+ // dd($diaries); // var_dump + 処理をここで中断
284
+
285
+
286
+
287
+ // view('フォルダ名.ファイル名(blade.phpは除く), [配列など渡してあげたいもの]');
288
+
289
+ return view('diaries.index', [
290
+
291
+ // キー と 値で渡す (別ファイルで、キーは、$diariesで指定)
292
+
293
+ 'diaries' => $diaries
294
+
295
+ ]);
296
+
297
+ }
298
+
299
+
300
+
301
+ // 新規追加の画面を表示するメソッド
302
+
303
+ public function create()
304
+
305
+ {
306
+
307
+ return view('diaries.create');
308
+
309
+ }
310
+
311
+
312
+
313
+ // 新規追加の場面で投稿ボタンが押されたとき
314
+
315
+ // 投稿処理をするメソッド
316
+
317
+ // 引数のRequest = $_POST みたいなイメージ
318
+
319
+ public function store(CreateDiary $request)
320
+
321
+ {
322
+
323
+ // ここからデータの登録・・・投稿されたデータをdiariesテーブルに入れたい
324
+
325
+ // Diaryモデルのインスタンスを取得
326
+
327
+ $diary = new Diary();
328
+
329
+
330
+
331
+ // 画面で入力されたタイトルを代入
332
+
333
+ // 画面で渡ってきたtitle($requestに入っている)を、設定
334
+
335
+ $diary->title = $request->title;
336
+
337
+ // 画面で入力された本文を代入
338
+
339
+ $diary->body = $request->body;
340
+
341
+ $diary->user_id = \Auth::user()->id; //追加 ログインしてるユーザーのidを保存 \Auth::user() = ログインしているユーザー
342
+
343
+
344
+
345
+ // モデルからデータベースにデータを追加するとき save() = INSERT INTO
346
+
347
+ $diary->save(); // DBに保存
348
+
349
+
350
+
351
+ // 一覧ページにリダイレクト (これやらないと、戻るボタン押したとき[二重登録される]) [フォームを再送信しますか?]のアラートが出なくなる
352
+
353
+ // 戻ったときのフォームを再送信しますか?の対策のため
354
+
355
+ return redirect()->route('diary.index');
356
+
357
+ }
358
+
359
+
360
+
361
+ // 削除を実行するメソッド
362
+
363
+ public function destroy(Diary $diary) // バインディングした
364
+
365
+ {
366
+
367
+ // URLを直接入力しても表示できないようにする ログインしているユーザー != 投稿のユーザーIDと一致していなければ、
368
+
369
+ if (\Auth::user()->id !== $diary->user_id) {
370
+
371
+ abort(403);
372
+
373
+ }
374
+
375
+
376
+
377
+ // Diaryモデルのインスタンス化 しなくてもいけるべや
378
+
379
+ // $diaries = new Diary();
380
+
381
+
382
+
383
+ // Diaryモデルを使って、削除したい要素の取得
384
+
385
+ // $diary = $diaries->find($id);
386
+
387
+ // $diary = Diary::find($id);
388
+
389
+
390
+
391
+ // 取得した要素を削除
392
+
393
+ $diary->delete();
394
+
395
+
396
+
397
+ // 一覧画面に戻る
398
+
399
+ return redirect()->route('diary.index');
400
+
401
+
402
+
403
+ }
404
+
405
+
406
+
407
+ // 編集画面を表示するメソッド
408
+
409
+ // public function edit(int $id)
410
+
411
+ public function edit(Diary $diary) // $diary = Diary::find($id); 自動的に該当するモデルのインスタンスを作成
412
+
413
+ {
414
+
415
+
416
+
417
+ // URLを直接入力しても表示できないようにする ログインしているユーザー != 投稿のユーザーIDと一致していなければ、
418
+
419
+ if (\Auth::user()->id !== $diary->user_id) {
420
+
421
+ abort(403);
422
+
423
+ }
424
+
425
+
426
+
427
+
428
+
429
+ // この仕組みを、ルートモデルバインディング [バインド=縛られる・対応]
430
+
431
+
432
+
433
+ // IDをもとに1件取得 バインディングしたからいらない
434
+
435
+ // $diary = Diary::find($id);
436
+
437
+
438
+
439
+ // 編集画面を表示するとき、取得結果を渡す
440
+
441
+ return view('diaries.edit', [
442
+
443
+ 'diary' => $diary
444
+
445
+ ]);
446
+
447
+ }
448
+
449
+
450
+
451
+ // 編集処理をするメソッド
452
+
453
+ public function update(CreateDiary $request, Diary $diary) // バインディングした
454
+
455
+ {
456
+
457
+
458
+
459
+ // URLを直接入力しても表示できないようにする ログインしているユーザー != 投稿のユーザーIDと一致していなければ、
460
+
461
+ if (\Auth::user()->id !== $diary->user_id) {
462
+
463
+ abort(403);
464
+
465
+ }
466
+
467
+
468
+
469
+ // IDをもとに、投稿のタイトル、本文を更新 インスタンス化しなくても使えるということは、static function find ()
470
+
471
+ // $diary = Diary::find($id);
472
+
473
+
474
+
475
+ $diary->title = $request->title;
476
+
477
+ $diary->body = $request->body;
478
+
479
+
480
+
481
+ $diary->save(); // updateしているからデータベースで自動で、更新の日時が入る migrationファイルにtimestampがある
482
+
483
+ // 一覧ページにリダイレクト
484
+
485
+ return redirect()->route('diary.index');
486
+
487
+ }
488
+
489
+
490
+
491
+ // いいねの数
492
+
493
+ public function like(int $id)
494
+
495
+ {
496
+
497
+ $diary = Diary::where('id', $id)->with('likes')->first();
498
+
499
+ // Diaryモデルのlikesメソッド
500
+
501
+ $diary->likes()->attach(Auth::user()->id);
502
+
503
+ }
504
+
505
+
506
+
507
+ }
508
+
509
+ ```
510
+
511
+
512
+
513
+ 下は、Diary.phpでモデルファイルです。
514
+
515
+ ```php
516
+
517
+ <?php
518
+
519
+
520
+
521
+ namespace App;
522
+
523
+
524
+
525
+ use Illuminate\Database\Eloquent\Model;
526
+
527
+
528
+
529
+ class Diary extends Model
530
+
531
+ {
532
+
533
+ // リレーションを定義 linksテーブルを中間テーブルとした、多対多の関係
534
+
535
+ public function likes()
536
+
537
+ {
538
+
539
+ return $this->belongsToMany('App\User', 'likes')->withTimestamps();
540
+
541
+ }
542
+
543
+ }
544
+
545
+ ```
546
+
547
+
548
+
181
549
  > これまでにやってことは、TOKENの確認、データ(id)の受け渡しの確認。
182
550
 
183
551