5
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

MVCフレームワーク比較一覧(Rails, Laravel)

Last updated at Posted at 2020-03-02

フレームワーク別にCRUDをまとめています。

新しい言語を学習するに当たってまとめています。
なので、今はRailsとLaravelになります。




全体像

Ruby/Ruby on Rails

PHP/Laravel

laravel構造.001_ut1537371684.jpeg

プロジェクトの作成

Rails

ターミナル
# バージョン指定なし
$ rails new プロジェクト名 --database=mysql --skip-test --skip-turbolinks --skip-coffe

## デフォルトがsqliteのため、mysqlに変更する      --database=mysql
## 何かと問題を起こすturbolinksを設定しない       --skip-turbolinks
## Ruby風にjsが記述できるcoffeファイルを利用しない  --skip-coffe



# バージョン指定あり
$ rails _5.2.2_ new プロジェクト名 --database=mysql --skip-test --skip-turbolinks  --skip-coffe

参考リンク
参考リンク

Laravel

ターミナル
# バージョン指定なし (初期値でmysqlを利用する)
$ composer create-project --prefer-dist laravel/laravel プロジェクト名

# バージョン指定あり (初期値でmysqlを利用する)
$ composer create-project --prefer-dist "laravel/laravel=5.5.*" sampleproject

#書き方はいろいろ
$ composer create-project laravel/laravel sampleproject --prefer-dist "6.0.*"

参考リンク




## ローカルサーバーの起動 ###Rails ```:ターミナル $ rails s ```

Laravel

ターミナル
$ php artisan serve



# ルーティング

Rails

rutes.rb
Rails.application.routes.draw do
  devise_for :users
  root 'users#index'

  resources :products do
    collection do
      get 'get_category_children', defaults: { format: 'json' }
      get 'get_category_grandchildren', defaults: { format: 'json' }
    end
    member do
      get 'get_category_children', defaults: { format: 'json' }
      get 'get_category_grandchildren', defaults: { format: 'json' }
    end
  end
end

Laravel

routes/web.php
Route::resource('photos', 'PhotoController');
// [GET](/photos)           ->index
// [GET](/photos/{id})      ->show($id)
// [GET](/photos/create)    ->create
// [POST](/photos)          ->store
// [GET](/photos/{id})      ->edit($id)
// [PUT/PATCH](/photos/{id})->update($id)
// [DELETE](/photos/{id})   ->destroy($id)

// ネストも出来る
Route::resource('photos.comments', 'PhotoCommentController');
// URLはこんな感じになる( photos/{photoId}/comments/{commentId} )

// only,except
Route::resource('photos', 'PhotoController', [
  'only' => ['index', 'show']
]);

// 5.4からはapi向けのresourceルーティングメソッドが追加
Route::apiResource('photos', 'PhotoController');
// resourceメソッドのcreate,editを省いただけのやつです

参考リンク
超参考リンク




コントローラー

Rails

コントローラーの生成

ターミナル
$ rails g controller users (コントローラー名複数系)

生成されたコントローラー

Users_Controller.rb
class UsersController < ApplicationController

  def index # view/users/indexのページを自動表示
    @products = Product.order(created_at: "DESC").includes(:host).page(params[:page]).without_count.per(5)
  end

  def search
    @products = Product.order(created_at: "DESC").includes(:host).page(params[:page]).without_count.per(5)
  end

  def new
  end

  def registration
  end

  def create
  end

  def show
    @user = User.find(params[:id])
  end
end

Laravel

コントローラーの生成

ターミナル
$ php artisan make:controller PostsController
app/HTTP/Controllers/PostsController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Post;

class PostsController extends Controller
{
    public function index() {
        $posts = Post::latest()->get();
        # $Posts = Post::orderBy('create_at', 'desc')->get();
        return view('posts.index', ['posts' => $posts]);
         # view/posts/index.blade.phpを読み込む
         # ['posts' => $posts]は変数の定義をしている。
    }
}




## モデル バリデーション、アソシエーションを設定することが多い。あとは独自の処理をモデルで設定して、呼び出しやすくすることもある。

Rails

モデルの作成

ターミナル
$ rails g model Post

作成されたモデル

post.rb
class Post < ApplicationRecord
end

マイグレーションファイルを編集する。

2020_03_02_create_post.rb
class CreatePost < ActiveRecord::Migration[5.2]
  def change
    create_table :products do |t|
      t.string     :name,         null: false, index: true
      t.text       :description,  null: false
      t.string     :period,       null: false
      t.integer    :price,        null: false
      t.references :host,         foreign_key: { to_table: :users }
      t.references :client,       foreign_key: { to_table: :users }
      t.timestamps
    end
  end
end

Laravel

モデルとmigrationファイルの作成

ターミナル
$ php artisan make:model Post --migration

これでモデルとmigrationファイルが生成されます。

app/Post.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    //
    // create()やfill()、update()で値が代入可能
    protected $fillable = [
        'title',
        'body'
    ];
    // create()やfill()、update()で値が代入不可
    protected $guarded = [
        'id',
    ];
}

カラムを更新させることが可能: $fillable (修理可能)
所謂ホワイトリストです。$fillableに指定したカラムのみ、create()やfill()、update()で値が代入されます。

カラムを更新させない指定:$guarded (ガード)
$guardedに指定したカラムのみ、create()やfill()、update()で値が代入されません。
参考



マイグレーションファイルを編集してカラムを追加しましょう
database/migrations/2020_03_02_create_posts_table.php
<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreatePostsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->increments('id');
            $table->string('title'); # カタムの型(カラム名)を設定
            $table->text('body'); # カタムの型(カラム名)を設定
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('posts');
    }
}

up()にマイグレーションを実行した際の処理を
down()にup()の処理を取り消す処理を実装します。

作成したマイグレーションファイルを実行して、カラムを作成します

ターミナル
$ php artisan migrate



## View

Rails

app/views/posts/index.html.haml


view上でモデルのカラムの値を表示する

変数(モデル).+カラム名

@post.title # タイトルが表示
@post.body  # 本文が表示
each
<% @posts.each do |post| %>
 <li>post.title</li>
<% end %>

Laravel

resources/views/posts/index.blade.php
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>myblog</title>
</head>
<body>
  <div class="container">
    <h1>Blog Posts</h1>
    <ul>
      @foreach ( $posts as $post )
      <li><a href="">{{ $post->title }}</a></li>
      @endforeach
    </ul>
  </div>
  
</body>
</html>

view上でモデルのカラムの値を表示する

変数(モデル).+カラム名

{{$post->title}} # タイトルが表示
{{$post->body}}  # 本文が表示
each

@eachfor ($posts as $post)
<li>{{$post->title}}</li>
@endforeach



## 設定・環境設定

Rails

Laravel

.env → configの流れが読ませるので、.envを編集すればconfigにも反映される。

.env
# mysqlが初期設定されている

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret

mysqlではなくて、sqliteで進めたい場合

.env
DB_CONNECTION=sqlite
config/app.php
5
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?