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

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

ただいまの
回答率

90.51%

  • PHP

    20395questions

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

  • Laravel 5

    1894questions

    Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Laravelでのバリエーション及びページネーション

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 225

Nitta

score 32

お世話になってます。PHP初心者です。
今、フォームから画像をアップロードするものを
作成しております。
確かに画像を所定の場所(public\item\photos)にアップロードできるのですが、
入力規則及びページネーションが上手く入りません。
以前、同類のやり方で上手くできたのですが、何故か今回は入りません。
ご教示お願いできませんでしょうか?
<やりたいこと>
フォームに入力規則及びページネーションを入れる
<エラー名>
Method Illuminate\Database\Eloquent\Collection::render does not exist
(Collectionクラスにrenderメソッドはない)

<やったこと>
$ehime->render()や$ehime->links()で試したがダメ

<参考サイト>
①Laravelのvalidationメソッドでバリデーションを実装する入門編(日本語エラーメッセージ付き)
https://www.ritolab.com/entry/40
②laravel5.5を使用して複数画像をアップロードする方法
https://qiita.com/netfish/items/ef01cdb5f58742563e87

<記入内容>
web.php

Route::get('items', 'ItemController@index');
Route::match(['GET', 'POST'], '/create', 'ItemController@create');


form(create.blade.php)

@extends('layouts.master_request')
@section('title', 'Laravel tutorial(Biginner)') 

@section('content')
@if (count($errors) > 0)
<ul>
   @foreach($errors->all() as $error)
     <li>{{ $error }}</li>
   @endforeach
</ul>
@endif
<!-- フォーム -->
<h3>Form_Sample(Enter_Screen)</h3>
<p>Please enter items</p>
<form action="{{ url('create') }}" method="POST" enctype="multipart/form-data">
   <label for="jan">Jan_Code:</label>
     <input type="text" class="form-control" name="jan" value="{{old('jan')}}">
   <br>
    <label for="name">Item_name</label>
       <input type="text" class="form-control" name="name" value="{{old('name')}}">
    <br>
    <label for="photo">Image_File(Multiple possible)</label>
       <input type="file" class="form-control" name="files[][photo]" multiple>
    <br>
    <hr>
    {{ csrf_field() }}
    <button class="btn btn-success"> Upload </button>
</form>
<table class="table table-striped table-hover">
    <thead>
    <tr>
    <th>No</th>
    <th>name</th>
    </tr>
    </thead>
    <tbody>
    @foreach($ehime as $item)
    <tr>
         <td>{{$item->item_id}}</td><td>{{$item->path}}</td>
    </tr>
    @endforeach
    </tbody>
</table> 
 <!-- page control -->
{!! $ehime->render() !!}
@endsection


Controller(ItemController.php)

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Item;
use App\ItemPhoto;
use App\Http\Requests\ItemRequest;
class ItemController extends Controller{

 public function index()
 {
  $items = ItemPhoto::all();
 return view('item.create')->with('ehime',$items);
 }

 public function create(Request $request)
 {
  // POST
  if($request->isMethod('POST')) {
  // 商品情報の保存
  $item = Item::create(['jan'=> $request->jan, 'name'=> $request->name]);
  // 商品画像の保存
   foreach ($request->file('files') as $index=> $e) {
    $ext = $e['photo']->guessExtension();
   $filename = "{$request->jan}_{$index}.{$ext}";
   $path = $e['photo']->storeAs('photos', $filename);
   // photosメソッドにより、商品に紐付けられた画像を保存する
   $item->photos()->create(['path'=> $path]);
   }
   return redirect()->action('ItemController@index');
  }
  // GET
  return view('item.create');
 } 

}


バリデーション(ItemRequest.php)

<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class ItemRequest extends FormRequest{

 public function authorize()
 {
   return true;
 }

 public function rules()
 {
  if($this->isMethod('get')) return[];        
 return [
    'jan'=>'required',
   'name'=>'required',
   'file.*.photo'=>'required|image|mimes:jpeg,png,jpg,gif',   
 ];
 }

 public function messages()
 {
 return [
    "required" => "Required items",
  "image" => "Specified files is not image files!!",
  "mines" => "Extension of specified files is not PNG or JPG or GIF!!",
 ];
 }

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • mts10806

    2018/07/19 10:39

    (2回目)全角空白でインデントつけてはいけませんよ。質問以前に動かないコードを提示してしまっています。コードフォーマッター機能のあるテキストエディタ使ってください。

    キャンセル

  • Nitta

    2018/07/19 14:58

    返信ありがとうございます。上記の内容全て対応しています。今後共よろしくお願いします。

    キャンセル

  • mts10806

    2018/07/19 15:16

    えっと、どこかでしょうか。インデントに全角空白が利用されまくってますけど。「コードフォーマッター機能のあるテキストエディタ使ってください。」と助言もしたのですが。

    キャンセル

回答 2

checkベストアンサー

+2

■ペジネーションが上手く行かない件

$items = ItemPhoto::all();

ここで「全件」取得しています。
全件取得の場合、ペジネーションは不要です。(いつでも、全1ページ)

ですので、

$ehime->render();
$ehime->links();

上記のような、ペジネーション関連の関数は、取得結果のCollectionに用意されません。

ペジネーションを使いたいなら、取得件数を制御してください。

■入力規則がかからない件

ItemController

public function create(Request $request)
{
// POST
if ($request->isMethod('POST')) {
// 商品情報の保存
$item = Item::create(['jan'=> $request->jan, 'name'=> $request->name]);
// 商品画像の保存
foreach ($request->file('files') as $index=> $e) {
$ext = $e['photo']->guessExtension();
$filename = "{$request->jan}_{$index}.{$ext}";
$path = $e['photo']->storeAs('photos', $filename);
// photosメソッドにより、商品に紐付けられた画像を保存する
$item->photos()->create(['path'=> $path]);
}
return redirect()->action('ItemController@index');
}

せっかく作成した ItemRequest を利用している部分がありませんので、
バリデーションはかからないと思います。

ItemRequest を使ってください。


上記、ほぼ答えですが、正解のコード自体は書いていません。
初心者さんとのことなので、これをヒント?にやり方を探してみると良いと思います。

それから、少し厳しいようですがlaravelの理解が足りていないのかな?と感じましたので、
リファレンスや、参考サイトなどをよく読まれることをお勧めします。

「以前は上手くできた」とのことですので、
そのうまくいった時のコードと、今のコードで「どこがどう違うのか」、にらめっこしてみるのもいいと思いますよ。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/19 10:18

    返信ありがとうございました。
    ページネーションは上手く行きましたが、
    public function create(ItemRequest $request)
    に変えてみたのですが、『App\Http\Requests\ItemRequestがない』 と
    なるんですが、間違いなくありますしどうすればいいでしょうか?

    キャンセル

  • 2018/07/19 15:12

    おや? Controllers のディレクトリの横に、Requests のディレクトリが置いてあるんですよね??
    書き方的には間違はなさそうかなと思うので、
    あとは、実際にファイルが置いてあるディレクトリ名と、namespace宣言やら、use宣言などの、スペルが間違っていないか確認してみると良いかもしれません。。。

    キャンセル

  • 2018/07/19 15:15

    お世話になってます。
    バリデーションできなかったのは、ItemRequest.phpファイルに記載している
    ItemRequestクラスの最後の『}』が無くなっていた為でした。
    誤記入(泣)。今後共よろしくお願いします。

    キャンセル

  • 2018/07/20 09:34

    解決したようで何よりです!

    キャンセル

+2

ページネーションを入れるのであれば$items = ItemPhoto::all();ではなくて$items = ItemPhoto::paginate(10);ですね。
10のところには1ページに表示したい件数を入れて下さい。
で、view側に{{ $ehime->links() }}でページャーが出るかと。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/19 10:13

    返信ありがとうございます。
    ページネーションは上手く行きました。
    ありがとうございました。

    キャンセル

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

  • ただいまの回答率 90.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • PHP

    20395questions

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

  • Laravel 5

    1894questions

    Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。