🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Laravel

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

PHP

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

1758閲覧

投稿一覧ページにログインしているユーザーのみの投稿を表示し、ページネーション機能を実装したいです。

tkm-mkzk

総合スコア4

Laravel

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

PHP

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2021/03/01 07:30

編集2021/03/02 02:20

前提

現在laravelを使って投稿や体重を管理できるアプリを作っております。

実現したいこと

投稿一覧ページにログインしているユーザーのみの投稿を表示し、ページネーション機能を実装したいです。コントローラーでログインユーザーの投稿のみを取得したいです。

発生している問題

投稿一覧ページにログインしているユーザーのみの投稿を表示することはできたのですが、今のやり方だとページネーションの表示がおかしくなってしまいます。(視覚的には他の人の投稿は見えないのだが、実際には取得されてしまっている。)

該当のソースコード

PHP

1//BlogController.php 2 3public function index(Request $request) 4 { 5 6 $search = $request->input('search'); 7 8 9 // 検索フォーム 10 $query = DB::table('blogs'); 11 12 // もしキーワードがあったら 13 if($search !== null){ 14 //全角スペースを半角に 15 $search_split = mb_convert_kana($search, 's'); 16 17 //空白で区切る 18 $search_split2 = preg_split('/[\s]+/', $search_split, -1, PREG_SPLIT_NO_EMPTY); 19 20 //単語をループで回す 21 foreach($search_split2 as $value) 22 { 23 $query->where('title', 'like', '%' .$value.'%') 24 ->orWhere('target_site', 'like', '%' .$value.'%') 25 ->orWhere('content', 'like', '%' .$value.'%') 26 ->orWhere('created_at', 'like', '%' .$value.'%'); 27 } 28 } 29 30 $query->select('id', 'title', 'target_site', 'content', 'created_at', 'user_id'); 31 $query->orderBy('created_at', 'desc'); 32 $blogs = $query->paginate(2); 33 34 return view('blog.index', compact('blogs')); 35 36 }

PHP

1//index.blade.php 2 3@extends('layouts.app') 4 5@section('content') 6<div class="container"> 7 <div class="row justify-content-center"> 8 <div class="col-md-12"> 9 <div class="card"> 10 <div class="card-header">{{ __('投稿一覧') }}</div> 11 12 <div class="card-body"> 13 @if (session('status')) 14 <div class="alert alert-success" role="alert"> 15 {{ session('status') }} 16 </div> 17 @endif 18 <form method="GET" action="{{ route('blog.create') }}"> 19 <button type="submit" class="btn btn-primary"> 20 新規投稿 21 </button> 22 </form> 23 24 <form method="GET" action="{{ route('blog.index') }}" class="form-inline my-2 my-lg-0"> 25 <input class="form-control mr-sm-2" name='search' type="search" placeholder="キーワード" aria-label="Search"> 26 <button class="btn btn-outline-success my-2 my-sm-0" type="submit">検索する</button> 27 </form> 28 29 <table class="table"> 30 <thead> 31 <tr> 32 <th scope="col">タイトル</th> 33 <th scope="col">鍛えた部位</th> 34 <th scope="col">内容</th> 35 <th scope="col">投稿日時</th> 36 <th scope="col">詳細</th> 37 </tr> 38 </thead> 39 <tbody> 40 @foreach($blogs as $blog) 41 @if( ( $blog->user_id ) === ( Auth::user()->id ) ) 42 <tr> 43 <th>{{ $blog->title }}</th> 44 <td>{{ $blog->target_site }}</td> 45 <td>{{ $blog->content }}</td> 46 <td>{{ $blog->created_at }}</td> 47 <td><a href="{{ route('blog.show', ['id' => $blog->id ]) }}">詳細</a></td> 48 </tr> 49 @endif 50 @endforeach 51 </tbody> 52 </table> 53 {{ $blogs->links() }} 54 </div> 55 </div> 56 </div> 57 </div> 58</div> 59@endsection

php

1<?php 2 3//Models/User.php 4 5namespace App\Models; 6 7use Illuminate\Contracts\Auth\MustVerifyEmail; 8use Illuminate\Database\Eloquent\Factories\HasFactory; 9use Illuminate\Foundation\Auth\User as Authenticatable; 10use Illuminate\Notifications\Notifiable; 11 12class User extends Authenticatable 13{ 14 use HasFactory, Notifiable; 15 16 /** 17 * The attributes that are mass assignable. 18 * 19 * @var array 20 */ 21 protected $fillable = [ 22 'name', 23 'email', 24 'password', 25 ]; 26 27 /** 28 * The attributes that should be hidden for arrays. 29 * 30 * @var array 31 */ 32 protected $hidden = [ 33 'password', 34 'remember_token', 35 ]; 36 37 /** 38 * The attributes that should be cast to native types. 39 * 40 * @var array 41 */ 42 protected $casts = [ 43 'email_verified_at' => 'datetime', 44 ]; 45 46 public function blogs(){ 47 return $this->hasMany('App\Models\Blog'); 48 } 49 50 public function weights(){ 51 return $this->hasMany('App\Models\Weight'); 52 } 53 54 public function selectUserFindById($id) 55 { 56 $query = $this->select([ 57 'id', 58 'name', 59 'email' 60 ])->where([ 61 'id' => $id 62 ]); 63 // first()は1件のみ取得する関数 64 return $query->first(); 65 } 66}

php

1<?php 2 3//Models/Blog.php 4 5namespace App\Models; 6 7use Illuminate\Database\Eloquent\Factories\HasFactory; 8use Illuminate\Database\Eloquent\Model; 9 10class Blog extends Model 11{ 12 use HasFactory; 13 14 public function user(){ 15 return $this->belongsTo('App\Models\User'); 16 } 17 18}

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

userモデルとblogモデルはリレーションを組んであります。
PHP 8.0.1
Laravel Framework 8.28.1

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

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

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

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

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

phper.k

2021/03/01 14:47 編集

blogs テーブルと blog テーブルってどんな関係性持っているのでしょう? テーブル設計がなんかおかしいと感じます。
guest

回答1

0

ベストアンサー

php

1<?php 2 3namespace App\Http\Controllers; 4 5use App\Blog; 6use Illuminate\Http\Request; 7 8class BlogController extends Controller 9{ 10 public function index(Request $request) 11 { 12 $word = mb_convert_kana($request->input('search'), 's'); 13 $words = explode(' ', $word); 14 15 $blogs = Blog::query() 16 ->where('user_id', $request->user()->id) 17 ->when(count($words), function ($query) use ($words) { 18 $query->where(function($query) use ($words) { 19 foreach ($words as $word) { 20 $query->where('title', 'like', '%' . $word . '%') 21 ->orWhere('target_site', 'like', '%' . $word . '%') 22 ->orWhere('content', 'like', '%' . $word . '%') 23 ->orWhere('created_at', 'like', '%' . $word . '%'); 24 } 25 }) 26 }) 27 ->latest() 28 ->paginate(); 29 30 return view('blog.index', compact('blogs')); 31 } 32} 33

投稿2021/03/01 14:50

編集2021/03/02 04:22
phper.k

総合スコア3923

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

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

tkm-mkzk

2021/03/02 02:22

回答ありがとうございます。 この記述で行ってみたのですが、ログインした際、他のユーザーの投稿も表示されてしまいます。
phper.k

2021/03/02 03:52 編集

回答修正しておきました
tkm-mkzk

2021/03/02 06:08

本当に初心者で申し訳ないのですが、コードを変えてみたりしたのですが、 ->when(count($words), function ($query) use ($words) { $query->where(function($query) use ($words) { foreach ($words as $word) { $query->where('title', 'like', '%' . $word . '%') ->orWhere('target_site', 'like', '%' . $word . '%') ->orWhere('content', 'like', '%' . $word . '%') ->orWhere('created_at', 'like', '%' . $word . '%'); } }) })  ←ここ 上記矢印のところでエラー(syntax error, unexpected '}')がでます。宜しくお願いします。
phper.k

2021/03/02 06:10

セミコロン
tkm-mkzk

2021/03/02 06:22

ありがとうございます。解決しました。 機会がありましたらまた宜しくお願い致します!
phper.k

2021/03/02 14:26

解決したのであれば、質問は閉じてくださいね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問