タグ: laravel

  • laravelでシンプルなformを作りMySQLに保存した

    laravelでシンプルなformを作りMySQLに保存した

    tl;dr;

    極限まで削り、ただtextを受け取りDBに格納するだけの処理。
    laravelでシンプルなformを作りMySQLに保存した。(ただの備忘録)

    view(入力画面)

     ソースは以下の通り。

    <head>
      <meta charset="utf-8">
      <!-- css をあてる際は以下のようにcssを読み込む-->
      <link rel="stylesheet" href="/css/style.css">
    </head>
    
    <form method="post" action="{{ url('/add') }}">
        {{ csrf_field() }}
        <p>
          <input type="text" name="title" placeholder="enter title">
        </p>
        <p>
          <textarea name="body" placeholder="enter body"></textarea>
        </p>
        <p>
          <input type="submit" value="Add">
        </p>
      </form>

    読み込むcss。今回は以下のようにした。

      input[type="text"], textarea {
        box-sizing: border-box;
        width: 500px;
        padding: 5px;
      }
      
      textarea {
        height: 100px;
      }

    router

    view(入力画面)と、そこからsubmitする宛先(post)を以下の通り設定した。

    両方とも PostsController  クラスを呼び、それぞれのメソッドを紐付けるようにした。

    <?php
    Route::get('/information', 'PostsController@create');
    Route::post('/add', 'PostsController@add');
    

     

    Model

    データベースに保存するハコ。

    `protected fillable`  として、DBへ保存できるようにした。

    <?php
    
    namespace App;
    
    use Illuminate\Database\Eloquent\Model;
    
    class Post extends Model
    {
        //
        protected $fillable = ['title', 'body'];
    }
    

    Controllers

    クライアントからの Post  は request 型で送られてくる。
    そのため、それぞれ適宜抜き出し、Modelに入れ、`save()`  することでDBへ保存されるようにした。

    <?php
    
    namespace App\Http\Controllers;
    use Illuminate\Http\Request;
    
    use App\Post;
    
    
    class PostsController extends Controller
    {
        public function create() {
            return view('information.create');
          }
    
          // request型で送られてくる
        public function add(Request $request) {
    
            $post = new Post();
            $post->title = $request->title;
            $post->body = $request->body;
            $post->save();
    
            return redirect('/information');
        }
    
    }

    以上。

    動作確認

    無事登録が完了

     

    laravel の実践向け書籍

  • laravelのImplicit Bindingについて調べた

    laravelのImplicit Bindingについて調べた

    はじめに

    Laravelでは、決められた変数名が、ルートセグメント名と一致するルートと、コントローラーアクションで定義されたEloquentモデルを自動的に紐付けるようだ。
    便利なんだろうけど、少し難しいので整理する。

    具体的な動き

    Route::get('api/users/{user}', function (App\User $user) {
        return $user->email;
    });

    この場合、$user変数は“` App\User “` モデルとしてタイプされ、変数名は“` {user}“` URLセグメントと一致するため、LarvelはリクエストURIの対応する値と、一致するIDをもつモデルインスタンスを自動的に挿入する。

    一致するモデルインスタンスが見つからない場合は、404 status codeを返却する。

    サンプルコード

    database

    router

    <?php
    
    Route::get('/', 'PostsController@index');
    
    // 通常の書き方
    //Route::get('/posts/{id}','PostsController@show');
    
    // Implicit Bindingを使った書き方
    Route::get('/posts/{post}', 'PostsController@show');

    Controller

    <?php
    
    namespace App\Http\Controllers;
    
    use App\Post;
    
    class PostsController extends Controller
    {
        public function index(){
            $posts = Post::all();
            return view('posts.index')->with('senddata', $posts);
        }
    
        // 通常の書き方
        // public function show($id){
        //     $posts = Post::findOrFail($id);
        //     return view('posts.show')->with('posts', $posts);
        // }\
    
        // Implicit Bindingを使った書き方
        public function show(Post $post){
            return view('posts.show')->with('posts', $post);
        }
    }
    

    blade file

    <!DOCUMENT html>
    
        <html lang="ja">
            <head>
                <meta charset="utf-8">
                <title>this is title</title>
                <link rel="stylesheet" href="/css/style.css">
            </head>
    
            <body>
                <div class='container'>
    
                    <h1> {{ $posts->title}} </h1>
                    <p>{!!  nl2br(e($posts->body)) !!} </p> 
    
                </dev>
            </body>
    
        </html>
    
    <!DOCUMENT html>
    
        <html lang="ja">
            <head>
                <meta charset="utf-8">
                <title>this is title</title>
                <link rel="stylesheet" href="/css/style.css">
            </head>
    
            <body>
                <div class='container'>
                    <h1> this is it!</h1>
                    <ul>
                        @forelse ($senddata as $data)
                        <!--通常の書き方
                        <li> <a href="{{ action('PostsController@show', $data->id) }} "> {{ $data->title }} </a></li>
                        --> 
    
                        <!--Implicit Bindingを使った書き方--> 
                        <li> <a href="{{ action('PostsController@show', $data) }} "> {{ $data->title }} </a></li>
                        @empty
                        empty!
                        @endforelse
                    </ul>
    
                </dev>
            </body>
    
        </html>

    結果

    参考情報

    https://laravel.com/docs/5.5/routing#implicit-binding

     

  • laravelのtinkerを使ってデータを投入する

    laravelのtinkerを使ってデータを投入する

    はじめに

    laravelにはtinkerという機能があり、“` php artisan tinker “` コマンドを用いてデータを入れることができる。

    前提条件

    以下のようなテーブルがあったとする

    CREATE TABLE `users` (
      `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
      `email` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
      `password` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
      `remember_token` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
      `created_at` timestamp NULL DEFAULT NULL,
      `updated_at` timestamp NULL DEFAULT NULL,
      PRIMARY KEY (`id`),
      UNIQUE KEY `users_email_unique` (`email`)
    ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

    “` app\User.php “` 配下のModele クラスに、
    ホワイトリスト形式で入力を受付けさせるようにする。

        protected $fillable = [
            'name', 'email', 'password',
        ];

    “` fillable “` で宣言されたカラムがホワイトリストとして機能し、これらのカラムにデータの投入が許可される。

    逆にブラックリスト形式で制御したい場合は “` guarded “` という変数名を利用する 

    データ投入

    tinkerを起動する

    php artisan tinker
    Psy Shell v0.9.11 (PHP 7.2.25 — cli) by Justin Hileman
    >>>

    の画面が出たら、以下の通り投入したいデータを入力

    post = App\User::create(['name'=>'tsukada hoge','email'=>'hoge@sumito.jp','password'=>'cccc']);

    動作確認

    データを確認すると無事投入された

     

    sample

    以下のようにデータを投入する場合は、

    “` app\User.php “` 配下のModele クラスを編集する必要はない。

    $ php artisan tinker
    Psy Shell v0.9.12 (PHP 7.2.25 — cli) by Justin Hileman
    >>> $post = new App\Post();
    => App\Post {#2894}
    >>> $post->title = 'title hogehoge';
    => "title hogehoge"
    >>> $post->body = 'body hogehoge';
    => "body hogehoge"
    >>> $post->save();
    => true
    >>>

    データを確認したい場合

    “` App\Post::all(); “` 

    PostはMODEL名

    >>> App\Post::all();
    => Illuminate\Database\Eloquent\Collection {#2903
         all: [
           App\Post {#2904
             id: 1,
             title: "title 1",
             body: "body 1",
             created_at: "2019-12-09 15:02:27",
             updated_at: "2019-12-09 15:02:27",
           },
           App\Post {#2905
             id: 2,
             title: "hogehoge",
             body: "body hogehoge",
             created_at: "2019-12-09 15:04:21",
             updated_at: "2019-12-09 15:04:21",
           },
         ],
       }
    >>>

    以下のように投入する場合は、エラーが発生する

    >>> App\Post::create(['title'=>'title 2', 'body'=>'body 2']);
    Illuminate/Database/Eloquent/MassAssignmentException with message 'title'
    >>>

    この場合は、“` app\User.php “` 配下のModele クラスを編集することで、投入を許可する。

    ※ “` app\User.php “` を編集した後は、tinkerに入り直す必要がある。

    $ php artisan tinker
    Psy Shell v0.9.12 (PHP 7.2.25 — cli) by Justin Hileman
    >>> App\Post::create(['title'=>'title 2', 'body'=>'body 2']);
    => App\Post {#2892
         title: "title 2",
         body: "body 2",
         updated_at: "2019-12-09 15:11:31",
         created_at: "2019-12-09 15:11:31",
         id: 3,
       }
    >>>

    無事入力できた

    >>> App\Post::all()->toArray();
    => [
         [
           "id" => 1,
           "title" => "title 1",
           "body" => "body 1",
           "created_at" => "2019-12-09 15:02:27",
           "updated_at" => "2019-12-09 15:02:27",
         ],
         [
           "id" => 2,
           "title" => "hogehoge",
           "body" => "body hogehoge",
           "created_at" => "2019-12-09 15:04:21",
           "updated_at" => "2019-12-09 15:04:21",
         ],
         [
           "id" => 3,
           "title" => "title 2",
           "body" => "body 2",
           "created_at" => "2019-12-09 15:11:31",
           "updated_at" => "2019-12-09 15:11:31",
         ],
       ]
    >>>

    条件付きのデータ取得

    x件目のデータを取得

    >>> App\Post::find(3)->toArray();
    => [
         "id" => 3,
         "title" => "title 2",
         "body" => "body 2",
         "created_at" => "2019-12-09 15:11:31",
         "updated_at" => "2019-12-09 15:11:31",
       ]
    >>>

    whereを使ったデータ取得

    >>> App\Post::where('id', '>', 2)->get()->toArray();
    => [
         [
           "id" => 3,
           "title" => "title 2",
           "body" => "body 2",
           "created_at" => "2019-12-09 15:11:31",
           "updated_at" => "2019-12-09 15:11:31",
         ],
       ]
    >>>

    orderByを用いた並び替え

    >>> App\Post::where('id', '>' , '1')->orderBy('created_at', 'desc')->get()->toArray();
    => [
         [
           "id" => 3,
           "title" => "title 2",
           "body" => "body 2",
           "created_at" => "2019-12-09 15:11:31",
           "updated_at" => "2019-12-09 15:11:31",
         ],
         [
           "id" => 2,
           "title" => "hogehoge",
           "body" => "body hogehoge",
           "created_at" => "2019-12-09 15:04:21",
           "updated_at" => "2019-12-09 15:04:21",
         ],
       ]
    >>>

    SQLのlimit

    >>> App\Post::where('id', '>' , '1')->get()->take(1)->toArray();
    => [
         [
           "id" => 2,
           "title" => "hogehoge",
           "body" => "body hogehoge",
           "created_at" => "2019-12-09 15:04:21",
           "updated_at" => "2019-12-09 15:04:21",
         ],
       ]
    >>>

     

     

    laravel の実践向け書籍

  • laravelのシンプルな機能でデータベースから値を取得し画面に表示する

    laravelのシンプルな機能でデータベースから値を取得し画面に表示する

    はじめに

    laravelのrouterとModelのみのシンプルな機能でデータベースから値を取得し画面に表示する。

    modelとmigrationを追加

    -mオプションでmigrationファイルも一緒に作ってくれるようになる。

    php artisan make:model Photo -m

    成功したようだ。

    migrationディレクトリ配下にmigrationファイルも一緒に作られた。

    注意したいのが、“` Photo “` という名前で作ったのに、migrationファイルの中では複数形の “`  photos “` になっているという点だ。

    今回、path,imageable_id,imageable_typeというカラムを追加した。

        public function up()
        {
            Schema::create('photos', function (Blueprint $table) {
                $table->increments('id');
                $table->string('path');
                $table->integer('imageable_id');
                $table->string('imageable_type');
                $table->timestamps();
            });
        }

    migration を実施

    $ php artisan migrate
    Migration table created successfully.
    Migrating: 2014_10_12_000000_create_users_table
    Migrated:  2014_10_12_000000_create_users_table
    Migrating: 2014_10_12_100000_create_password_resets_table
    Migrated:  2014_10_12_100000_create_password_resets_table
    Migrating: 2019_12_03_153039_create_photos_table
    Migrated:  2019_12_03_153039_create_photos_table

    成功したようだ

    データを投入する

    MySQL workbenchを用いてデータを投入する

    今回は上記データを入れた。

    Modelを編集する

    appディレクトリ配下にphp artisanコマンドで生成されたModelは格納される。
     
    <?php
    
    namespace App;
    
    use Illuminate\Database\Eloquent\Model;
    
    class Photo extends Model
    {
        //
        public function imageable(){
            return $this->morphTo('App\Photo');
        }
    }
    

    Photoテーブルを参照することとする。

    Routerを編集する

    Laravel 5.5では、routesディレクトリ配下の“` web.php “`がrouterの役割を担っている。

    以下の通り修正する

    <?php
    
    use App\Photo;
    
    Route::get('user/photos', function(){
        $user = Photo::find(1);
        return $user->path;
    });
    

    結果

    無事データベースの中の値の取得に成功した

     

     

     

  • laravelのmigration(migrate)を使いテーブルを全て削除する

    laravelのmigration(migrate)を使いテーブルを全て削除する

    はじめに

    なかなか実作業では使わないコマンドだが、ローカルで環境構築中だったら割とよく使いそうなコマンド。

    migrationで作ったテーブルを全て消す。

    前提条件

    例えば、以下の様なマイグレーションファイルがあって、全てRUNしている状態だとする。

    “` php artisan migrate:status “`の結果は以下の通り

    MySQL workbenchで確認すると、確かにテーブルは存在している。

    削除

    問題なくテーブルは作成されている様なので、全テーブル削除する

    php artisan migrate:reset

    結果は以下の通り

    ぞろぞろとRoll backされている。

    ステータスを確認すると、以下の通りRUNはNの状態。

    php artisan migrate:status

    MySQL workbenchでも削除されたことを確認できた

     

    laravel の実践向け書籍

  • laravelでrouteの一覧を表示する

    laravelでrouteの一覧を表示する

    はじめに

    Laravelでルーティングを全て表示する方法を紹介します。

    ルーティング設定の方法

    Laravelでは、有効なメソッドとURLを表示するために、以下のphp artisan route:listコマンドを利用します。

    php artisan route:list
    このコマンドを実行すると、以下のようなルーティング一覧が表示されます。
    +--------+----------+--------------+------+--------------------------------------------+--------------+
    | Domain | Method   | URI          | Name | Action                                     | Middleware   |
    +--------+----------+--------------+------+--------------------------------------------+--------------+
    |        | GET|HEAD | /            |      | App\Http\Controllers\PostsController@index | web          |
    |        | GET|HEAD | api/user     |      | Closure                                    | api,auth:api |
    |        | GET|HEAD | posts/back   |      | App\Http\Controllers\PostsController@back  | web          |
    |        | GET|HEAD | posts/{post} |      | App\Http\Controllers\PostsController@show  | web          |
    +--------+----------+--------------+------+--------------------------------------------+--------------+

    ルーティング設定の方法

    <?php
    Route::get('/', 'PostsController@index');
    // 数字のみを受け付けるルート設定
    Route::get('/posts/{post}', 'PostsController@show')->where('post','[0-9]+');
    // 記事のタイトルを受け付けるルート設定
    Route::get('/posts/{slug}', 'Posts

    laravel の実践向け書籍