ChupiPichu
@ChupiPichu (Chupi)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

【Laravel 8】登録済みユーザー別のコメント抽出合計を表示させるのにSQLSTATE[HY093]: Invalid parameter numberというエラーが出ました。

解決したいこと

前提として会員制掲示板は機能しており、下記のようなコードで投稿内容にある「おいしい」や「まずい」などのキーワードの合計を取得して表示できておりますが、ログインしたユーザーのみならず、登録認証済みの全員のコメント抽出合計を一覧に表示するにはどこを修正すればよいかご教授いただますでしょうか。
お手数をおかけしますが、よろしくお願いいたします。

発生している問題・エラー

SQLSTATE[HY093]: Invalid parameter number

該当するソースコード

Web.php
Route::get('/myfood', 'HomeController@myfood')->name('home.myfood');
Route::get('/foods', 'HomeController@foods')->name('home.foods');
HomeController.php
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\User;
use App\Models\Post;
use App\Models\Comment;
use Auth;
use Illuminate\Pagination\Paginator;
use Illuminate\Support\Facades\DB;

class HomeController extends Controller
{
public function __construct()
{
$this->middleware('auth');
}
public function myfood()
{
$user = auth()->user()->id;
$myusers=User::where('id', $user)->get();
$PostsOisiCount = Post::where('user_id', $user)->where(function($query) {$query->where('body', 'like', '%delicious%')
->orWhere('body', 'like', '%bad%');})->count();
$PostsCount = Post::where('user_id', $user)->count();
return view('myfood', compact('user', 'myusers', 'PostsOisiCount', 'PostsCount'));
}
public function foods()
{
$users = User::all();
$PostsOisiCount = Post::where('body', 'like', '%delicious%')
->orWhere('body', 'like', '%bad%')
->count();
$PostsCount = Post::count();
return view('foods', compact('users', 'PostsOisiCount', 'PostsCount'));
}
}
myfoodBlade.php
<table>
<thead>
<tr>
<th scope="col">#</th>
<th scope="col">Name</th>
<th scope="col">Results</th>
</tr>
</thead>
<tbody>
@foreach($myusers as $myuser)
<tr>
<th>{{$myuser->id}}</th>
<td>{{$myuser->name}}</td>
<td>
($PostsOisiCount / $PostsCount ) * 100
</td>
</tr>
@endforeach
</tbody>
</table>
foodsBlade.php
<table>
<thead>
<tr>
<th scope="col">#</th>
<th scope="col">Name</th>
<th scope="col">Results</th>
</tr>
</thead>
<tbody>
@foreach($users as $user)
<tr>
<th>{{$user->id}}</th>
<td>{{$user->name}}</td>
<td>
($PostsOisiCount / $PostsCount ) * 100
</td>
</tr>
@endforeach
</tbody>
</table>

自分で試したこと

myfoodBlade.phpにおいて投稿内容にある「おいしい」や「まずい」などのキーワードの合計を取得して表示できておりますが、foodsBlade.phpにてログインしたユーザーのみならず、登録認証済みの全員のコメント抽出合計を一覧に表示するのにエラーになってしまいました。

0

1Answer

Comments

  1. @ChupiPichu

    Questioner

    コメントありがとうございます。
    $PostsOisiCount = Post::where('body', 'like', '%delicious%')
    ->orWhere('body', 'like', '%bad%')
    ->count();
    です。
  2. 以下のようにして、実行しているクエリがSQLツールなどで実行可能か確認できますか?

    dd(Post::where('body', 'like', '%delicious%')
    ->orWhere('body', 'like', '%bad%')
    ->toSql());
  3. @ChupiPichu

    Questioner

    コメントありがとうございます。
    組み込んでみましたらが、実行したら以下のように表示されています。
    "select * from `posts` where `body` like ? or `body` like ? ▶"
  4. ありがとうございます。

    バインドパラメータの方忘れていました。。。

    以下のようにすることで、バインドパラメータありのクエリが出力できるので再度ご確認お願いできますか?
    $builder = Post::where('body', 'like', '%delicious%')->orWhere('body', 'like', '%bad%');
    $sql = preg_replace_array('/\?/', $builder->getBindings(), $builder->toSql());
    dd($builder->toSql(), $builder->getBindings(), $sql);

    おそらく、以下のクエリ文を実行する想定と思いますが、
    `select * from posts where body like '%delicious%' or body like '%bad%'`
    は問題なくクエリ実行ができると思っていいですよね?
  5. @ChupiPichu

    Questioner

    コメントありがとうございます。
    はい、実行できております。
    再度教えて頂いた内容の出力結果は以下の通りです。
    "select * from `posts` where `body` like ? or `body` like ? ▶"
    array:2 [▼
    0 => "%おいしい%"
    1 => "%まずい%"
    ]
    "select * from `posts` where `body` like %おいしい% or `body` like %まずい% o ▶"

    お手数をおかけしますが、よろしくお願いいたします。
  6. すいません、こちらでも試してみましたがそのような現象が起こりませんね。

    パラメータの数に問題がある場合にそのようなエラーになるようですが
    本現象ではそのケースに該当しませんね。

Your answer might help someone💌