質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

1737閲覧

Laravel6: コメント削除機能を実装したが,View側で投稿が消えない。

kubotea

総合スコア2

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2021/08/12 08:16

編集2021/08/12 10:56
コード ```### 前提・実現したいこと こんにちは。 現在Laravel6にてアプリの中のコメント機能を実装しており,その中で削除機能(論理削除)をつけようとしています。内部では削除ができているようなのですが,view側では投稿が残ってしまい,1回目以降削除を行おうとするとエラーが発生します。 ### 発生している問題・エラーメッセージ

エラーメッセージ Symfony\Component\Debug\Exception\FatalThrowableError
Call to a member function delete() on null
https://b17703b4956f4d149f4f7aeada1fb430.vfs.cloud9.us-east-2.amazonaws.com/artists/1/1/2

### 該当のソースコード ```ここに言語名を入力 PHP ソースコード<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Post; use App\Artist; use App\SongTitle; use App\Lyric; class PostController extends Controller { public function store(Request $request, $artist_id, $song_title_id, Post $post) { $input = $request['post']; $post->fill($input)->save(); return redirect('/artists/'.$artist_id.'/'.$song_title_id); } public function destroy($artist_id, $song_title_id, $post_id) { Post::find($post_id)->delete(); return redirect('/artists/'.$artist_id.'/'.$song_title_id); } } ```ここに言語を入力 コード

@extends('layouts.app')

@section('content')
<h1>{{ $lyric->name }}</h1>
<div class="lyric">
<img src="{{ asset($lyric->body) }}">
</div>

<h1>コメント</h1> <div class='posts'> @foreach ($posts as $post) <div class='post'> <h2 class='title'>{{ $post->name }}</h2> <p class='body'>{{ $post->content }}</p> <form style="display: inline-block;" method="POST" action="/artists/{{ $artist_id }}/{{ $song_title_id }}/{{ $post->id }}"> @csrf @method('DELETE') <button class="btn btn-danger">削除する</button> </form> </div> @endforeach <form action="/artists/{{ $artist_id }}/{{ $song_title_id }}" method="POST"> @csrf <div class="name"> <h2>ユーザーネーム</h2> <input type="text" name="post[name]" placeholder="タイトル"/> </div> <div class="content"> <h2>内容</h2> <textarea name="post[content]" placeholder="コメント"></textarea> </div> <input type="submit" value="保存"/> </form> </div>

@endsection

コード ```<?php namespace App; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; class Post extends Model { use softDeletes; protected $fillable = ['name', 'content']; public function getPaginateByLimit(int $limit_count = 10) { return $this->orderBy('updated_at', 'DESC')->paginate($limit_count); } } ```ここに言語を入力 コード ```<?php /* |-------------------------------------------------------------------------- | Web Routes |-------------------------------------------------------------------------- | | Here is where you can register web routes for your application. These | routes are loaded by the RouteServiceProvider within a group which | contains the "web" middleware group. Now create something great! | */ Auth::routes(); Route::get('/', 'MypageController@index') -> middleware('auth'); Route::get('/artists', 'ArtistController@index'); Route::get('/artists/search', 'ArtistController@search'); Route::get('/artists/{artist_id}/{song_title_id}', 'LyricController@show'); Route::get('/artists/{artist}', 'SongTitleController@index'); Route::post('/artists/{artist_id}/{song_title_id}', 'PostController@store'); Route::delete('/artists/{artist_id}/{song_title_id}/{post_id}', 'PostController@destroy'); ```ここに言語を入力 コード

MariaDB []> select * from posts;
+----+--------------+---------+---------------------+---------------------+---------------------+
| id | name | content | created_at | updated_at | deleted_at |
+----+--------------+---------+---------------------+---------------------+---------------------+
| 1 | ああああ | aaaaa | 2021-08-07 07:07:27 | 2021-08-10 13:14:58 | 2021-08-10 13:14:58 |
| 2 | ああああ | aaaa | 2021-08-09 14:44:14 | 2021-08-10 16:00:05 | 2021-08-10 16:00:05 |
| 3 | aaaa | aaaa | 2021-08-10 13:43:46 | 2021-08-10 16:00:13 | 2021-08-10 16:00:13 |
| 4 | aaaa | a | 2021-08-11 02:22:21 | 2021-08-11 02:23:55 | 2021-08-11 02:23:55 |
| 5 | ああああ | aaaaa | 2021-08-12 05:27:08 | 2021-08-12 05:27:31 | 2021-08-12 05:27:31 |
| 6 | ああああ | aaaa | 2021-08-12 06:57:29 | 2021-08-12 07:05:14 | 2021-08-12 07:05:14 |
+----+--------------+---------+---------------------+---------------------+---------------------+
6 rows in set (0.00 sec)

コード ```<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Lyric; use App\SongTitle; use App\Post; class LyricController extends Controller { public function show($artist_id, $song_title_id) { $lyric = SongTitle::find($song_title_id)->lyrics; $posts = \DB::table('posts')->get(); dd($posts); return view('Lyric.show')->with(['lyric' => $lyric, 'posts' => $posts, 'artist_id' => $artist_id, 'song_title_id' => $song_title_id]); } }

試したこと

ddし,各idと引数の関係が一致していることを確認しました。

補足情報(FW/ツールのバージョンなど)

当方teratailを初めて使用したため,質問に不備等あるかもしれませんがご容赦くださいませ。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

AbeTakashi

2021/08/12 08:55

「1回目以降削除を行おうとするとエラーが発生します。」とのことですので、その際に画面に表示されているエラーメッセージ、その瞬間に記録されたサーバのエラーログを質問文に追加してください。エラーに関する情報は重要な要素なので、常に質問文に入れるべきでしょう。
kubotea

2021/08/12 09:36

おっしゃる通りでした。ご指摘ありがとうございます。 追加いたしましたのでぜひご覧になっていただけると助かります。よろしくお願い致します。
AbeTakashi

2021/08/12 10:50

なるほど、エラーメッセージは直接は関係なかったようですが、エラーメッセージを見てようやく質問の意味が分かりました。$postsのリストがSoftDeleteが上手く効いてないってことですよね? そうであれば、テンプレート内の$postsのデータをDBから取得しているところのソースコードがないようなので、そちらを質問文内に追記お願いいたします。
kubotea

2021/08/12 11:04 編集

度々ありがとうございます。 ご指摘いただいた部分を追加致しました。SQLを見る限り,SoftDelete自体はできているようなのですがViewを見ると投稿が残ってしまっているんです。おそらくSoftDelete自体はできているため,1回目以降削除を実行するとnullだと言われ,エラーが起きてしまうのだと思います。稚拙な説明で申し訳ないのですが,また何かありましたら仰ってくださいませ。
guest

回答1

0

ベストアンサー

$posts = \DB::table('posts')->get();

とDBファサードを使ったらSoftDeleteは上手く機能しません。

$post = App\Post::all();

のようにEloquentモデルを使用すればSoftDeleteが上手く機能します(↑はざっくり書いたので、環境に合わせて正しく書いてください)。

参考)
https://readouble.com/laravel/6.x/ja/eloquent.html

どうしてもDBファサードを使用したいのであれば、deleted_atがnullである条件を追加してください。

投稿2021/08/12 11:18

AbeTakashi

総合スコア4853

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kubotea

2021/08/12 11:30

ありがとうございます! おっしゃり通りに書き換えた結果,思った通りに表示がされていました。ここら辺の違い等もう一度自身で復習したいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問