フレームワーク別にCRUDをまとめています。
新しい言語を学習するに当たってまとめています。
なので、今はRailsとLaravelになります。
全体像
Ruby/Ruby on Rails
PHP/Laravel
プロジェクトの作成
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