20210101のlaravelに関する記事は9件です。

Laravel6でTwitterログインを実装する

この記事ではLaravel6でTwitterログインを実装する手順を解説していきます。

メモ程度ですが、悪しからず。

Twitter Developerの登録

まずはTwitter Developerにてアプリを作成してください。

env.ファイルの作成

とりあえずTwitterAPIを使う時の初期設定。

TWITTER_CLIENT_ID=
TWITTER_CLIENT_SECRET=
TWITTER_CLIENT_ID_ACCESS_TOKEN =
TWITTER_CLIENT_ID_ACCESS_TOKEN_SECRET =
CALLBACK_URL=http://127.0.0.1:8000/login/twitter/callback

空白の箇所は自分のやつを入れる。

config/service.phpに処理追加

今回は必要ないけど、とりあえず追加しておく。
envファイルから呼び出すわけにはいかないので、config経由するための記述。

'twitter' => [
       'client_id' => env('TWITTER_CLIENT_ID'),
       'client_secret' => env('TWITTER_CLIENT_SECRET'),
       'access_token' => env('TWITTER_CLIENT_ID_ACCESS_TOKEN', ''),
       'access_token_secret' => env('TWITTER_CLIENT_ID_ACCESS_TOKEN_SECRET', ''),
       'redirect' => env('CALLBACK_URL')
    ],

config/appに処理追加

下記を追加する。
サービスプロバイダへ登録して、コンテナに登録する。
あとエイリアスにも追加する。

    'providers' => [
        ~省略~
        Laravel\Socialite\SocialiteServiceProvider::class, //Socialiteを使う設定

    ],

    'aliases' => [
        ~省略~
        'Socialite' => Laravel\Socialite\Facades\Socialite::class,//Socialiteを使う設定

    ],

Socialiteをインストール

composer require laravel/socialite

SocialiteについてはLaravel6ドキュメントを見るべし。

ルーティングの追加

Route::get('login/twitter', 'Auth\LoginController@redirectToTwitterProvider');
Route::get('login/twitter/callback', 'Auth\LoginController@handleTwitterProviderCallback');

Loginコントローラーに処理を追加

とりあえずここまで。

    use Socialite;

    ~省略~

    public function redirectToTwitterProvider()
   {
       return Socialite::driver('twitter')->redirect();
   }

    public function handleTwitterProviderCallback()
    {
        $user = Socialite::driver('Twitter')->user();
        dd($user);
    }

テーブルの作成

php artisan make:migration create_social_users --create social_users

中身は次の通り。

Schema::create('social_users', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->bigInteger('user_id')->unsigned()->index();
            $table->string('provider_user_id')->index();
            $table->timestamps();

            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
        });

usersテーブルの拡張

php artisan make:migration add_social_columns_to_users --table users

中身は次の通り。

    public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->string('unique_id')->after('id');
            $table->string('avatar')->after('password');
            $table->text('bio')->after('avatar');
            $table->string('email')->nullable()->change();
            $table->string('password')->nullable()->change();
        });
    }

    public function down()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->string('password')->change();
            $table->string('email')->change();
            $table->dropColumn('bio');
            $table->dropColumn('avatar');
            $table->dropColumn('unique_id');
        });
    }

マイグレーションの実行

下記をインストール。
カラム属性を変更する時は必要。

composer require doctrine/dbal

もしエラーが出たら、バージョンを指定すればOK。

次にマイグレーション実行。

php artisan migrate

モデルの作成

php artisan make:model SocialUser



リレーションも追加しておく。
まずはUserモデル。

    public function socialUsers()
    {
        return $this->hasMany(SocialUser::class);
    }

下記も。

    public function user()
    {
        return $this->belongsTo(User::class);
    }

Loginコントローラーに処理追加。

<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use App\User;
use App\SocialUser;
use Auth;
use DB;

use Socialite;

class LoginController extends Controller
{

    use AuthenticatesUsers;

    protected $redirectTo = RouteServiceProvider::HOME;

    public function __construct()
    {
        $this->middleware('guest')->except('logout');
    }

    public function redirectToTwitterProvider()
    {
        return Socialite::driver('twitter')->redirect();
    }

    public function handleTwitterProviderCallback()
    {
        $providerUser = Socialite::driver('Twitter')->user();


        // 既に存在するユーザーかを確認
        $socialUser = SocialUser::where('provider_user_id', $providerUser->id)->first();

        if ($socialUser) {
            // 既存のユーザーはログインしてトップページへ
            Auth::login($socialUser->user, true);
            return redirect('/');
        }

        // 新しいユーザーを作成
        $user = new User();
        $user->unique_id = $providerUser->nickname;
        $user->name = $providerUser->name;
        $user->avatar = $providerUser->user['profile_image_url_https'];
        $user->bio = $providerUser->user['description'];

        $socialUser = new SocialUser();
        $socialUser->provider_user_id = $providerUser->id;

        DB::transaction(function () use ($user, $socialUser) {
            $user->save();
            $user->socialUsers()->save($socialUser);
        });

        Auth::login($user, true);
        return redirect('/');
    }
}

参考

Laravel Socialiteを使ってTwitterアカウントでログイン機能
Laravel6.0+SocialiteでTwitterログインを実装する

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel8.x でルーティングが上手くいかない

エラー

dockerを用いてLaravelを触り始めて早速、ルーティングが上手くできない。

「controllerがないよ」と怒られる。
(Target class [TestController] does not exist.)

スクリーンショット 2021-01-01 15.51.33.png

web.php
Route::get('/tests/test', 'TestController@index');
TestController.php
namespace App\Http\Controllers;

use Illuminate\Http\Request;

class TestController extends Controller
{
    //
    public function index(){
      return view('tests/test');
    }
}
test.blade.php
<h1>test.blade.phpファイルだよ!!</h1>

解決

バージョンに合ったドキュメントを読んで解決
Laravel 8.x ルーティング
web.phpを編集

web.php
use Illuminate\Support\Facades\Route;

// 以下追加
use App\Http\Controllers\TestController;

// 以下修正
Route::get('/tests/test', [TestController::class, 'index']);

スクリーンショット 2021-01-01 15.57.17.png

解決まで

  • エラーは9割タイプミス→何度確認してもエラー
  • 6.xのドキュメント読んで初心に帰る→おそらく間違ってない
  • 今回触ってるの8.xだった...ドキュメント読む→書き方違う!?

これから

「使うクラスをすべてuseで指定するのは面倒...」と思ったが、以前の記法も使える模様

もとの自動プレフィクス付きコントローラルーティングを使い続けたい場合は、RouteServiceProvider内の $namespaceプロパティの値を設定し、bootメソッド内のルート登録を$namespaceプロパティを使用するように変更します。
Laravel 8.x アップグレードガイド

私はとりあえず教科書通りに進めます。
バージョン意識していないのが致命的だった。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】8.x でルーティングが上手くいかない

エラー

dockerを用いてLaravelを触り始めて早速、ルーティングが上手くできない。

「controllerがないよ」と怒られる。
(Target class [TestController] does not exist.)

スクリーンショット 2021-01-01 15.51.33.png

web.php
Route::get('/tests/test', 'TestController@index');
TestController.php
namespace App\Http\Controllers;

use Illuminate\Http\Request;

class TestController extends Controller
{
    //
    public function index(){
      return view('tests/test');
    }
}
test.blade.php
<h1>test.blade.phpファイルだよ!!</h1>

解決

バージョンに合ったドキュメントを読んで解決
Laravel 8.x ルーティング
web.phpを編集

web.php
use Illuminate\Support\Facades\Route;

// 以下追加
use App\Http\Controllers\TestController;

// 以下修正
Route::get('/tests/test', [TestController::class, 'index']);

スクリーンショット 2021-01-01 15.57.17.png

解決まで

  • エラーは9割タイプミス→何度確認してもエラー
  • 6.xのドキュメント読んで初心に帰る→おそらく間違ってない
  • 今回触ってるの8.xだった...ドキュメント読む→書き方違う!?

これから

「使うクラスをすべてuseで指定するのは面倒...」と思ったが、以前の記法も使える模様

もとの自動プレフィクス付きコントローラルーティングを使い続けたい場合は、RouteServiceProvider内の $namespaceプロパティの値を設定し、bootメソッド内のルート登録を$namespaceプロパティを使用するように変更します。
Laravel 8.x アップグレードガイド

私はとりあえず教科書通りに進めます。
バージョン意識していないのが致命的だった。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel + Inertia + Vueで簡単にAPI実装する

はじめに

2021年明けましておめでとうございます!
2020年は色々あり、コロナに翻弄された年でした。
この逆境に立ち向かい、社会に貢献されているすべての皆様に敬意を表させて頂きます。
恐らく2021年も、変わらずな環境下であると思われますが…皆様同様に私も負けじと頑張ります。

さて…PHPerの皆様、Laravel8をガンガンお使いでしょうか?
Laravel8では、Laravel JetstreamというUIライブラリが用意されており、簡単にアプリケーションを作ることができるようになりましたね。
このJetstreamは、以前から似たようなものがありましたが、より簡単に作ることができるようになりました。
CSSをBootstarpからTailwind CSS に変更しており、より柔軟にCSSを使いUIを作ることができます。
さらに、実装においては、Livewireを用いてBladeを利用するか、Inertia.jsを用いてVueを利用するかを選択することができます。
Laravel8を触ってから、Inertiaを初めて知ったのですが、非常に理にかなった思想で便利だったので、そのInertiaについて書こうと思います。

Inertiaとは?

Inertiaは、「Modern Monolith(モダン モノリス)」という事を謳っています。
マイクロサービスが広まる中、モノリシックは時代錯誤な気がしますよね。
フロントエンド + バックエンドの構成では、APIを設計し実装し、フロントではそれを呼び出して描写する…これを書くAPI毎に毎回書くわけで、よく考えればこれは冗長ではないでしょうか?
Inertiaはその「毎回書くこと」をライブラリで吸収して、実装を簡単にするためのライブラリです。
API設計は必要ありません、APIの呼び出しも必要ありません。
変数やルーティングは、バックエンドの実装をもとにフロントエンドの変数のアサインやルーティングを作成してくれます。
フロントエンド + バックエンドの構成でありながら、サーバーサイドテンプレートを扱うように(モノリシックであるかのように)、 実装が可能です。
なので、ModernでありながらMonolithなもの、というわけです。

inertia_1.png

inertia_2.png

実装サンプル

routes/web.php

<?php

use Illuminate\Support\Facades\Route;

// 通常のroutingです。
Route::resource('/user','App\Http\Controllers\UserController');

UserController.php

<?php

namespace App\Http\Controllers;

use App\Models\User;
use Inertia\Inertia;

class UserController extends Controller
{
    public function index()
    {
        // Inertia::renderを呼び出す事で、どのコンポーネントに対して
        // どの変数をセットするかをここできめ、vueにも反映させることができます。
        return Inertia::render(
            'User/Index',
            ['users' => User::all()]
        );
    }

    // show
    // create
    // store
    // edit
    // update
    // destroy
}

resources/js/Pages/User/index.vue

<template>
  <layout title="Users">
    <div v-for="user in users" :key="user.id">
      <inertia-link :href="`/users/${user.id}`">
        {{ user.name }}
      </inertia-link>
      <div>{{ user.email }}</div>
    </div>
  </layout>
</template>

<script>
import Layout from '../Shared/Layout'

export default {
  components: {
    Layout,
  },
  /* Controllerで指定した変数をpropsで受け取るため、同じ変数名を指定します。
    IFはInertiaにおまかせです。
  */
  props: {
    users: Array,
  },
}
</script>

vue側でのルーティングは、Vue Routerを使わずに、Inertia側で受け持ちます。
その為、this.$route.params等は使えず、laravel側からパラメータは受け渡すことになります。
* vueを触っていると使えるのが当たり前だと思っており、使えず若干ハマりました…。

まとめ

実装サンプルのように、APIのレスポンス時も、フロントで受け取る側もいつもの記述は必要がないことがわかります。
実はコンポーネントの設計もある程度もInertiaの設計に引っ張られる為、構成が整っていいかもしれません。
デメリットとしては、ブラックボックス化してしまう事くらいでしょうか。
ただフレームワーク自体もある程度ブラックボックス化しているわけで、それと同じようなものだと考えれば、気にならないくらいのレベルです。
メリットとしては、「バックエンドテンプレートと似たような感じでVueを使える」「APIやりとりのコードが極端に減る」等です。

是非、モダンモノリスなライブラリ「Inertia」を使って見てください。

それでは今年も頑張りましょう!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】既定Userのmigrationにてエラーが出た場合にチェックする点

■前提
・Laravelでのプロジェクト作成が2回目以降であること
・databaseを作成済であること
・使っているdatabaseはmysqlであること

■概要
プロジェクト作成時に既定にあるUserテーブルに対してmigrationをかけた際に
エラーが2点発生した。
①既にuserテーブルが存在している(users already exists〜辺り)
85b91b6a14ed0427e14cce1d64749c67.png

②user_emailの設定にエラーがある(key was too long~の辺り)
d345df1fb0cfb2338f674b46c25d5dea.png

■対策
上記エラーに対しての対策は以下の通り。
①.envにてDB_DATABASEを今回作成したbatabase名に修正する
※今回はtodoというデータベースを作成しました。
af9345092081e0b3669017c43dffee5c.png

②database.php内のmysqlにて「charaset」/「collation」をutf8mb4からutf8に変更する。
88d117fae68472d365e39ba759165c18.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

laravel MySQL tinyInteger型のカラムはchangeできない

目的

  • マイグレーションファイルを用いてTinyInt型のカラム情報を変更しようとしたけどエラーが出たのでまとめる

情報

  • 今回の事例はすでに作成されているTinyInt型カラムのコメントを変更しようとした。

エラーまでの経緯

  1. マイグレーションファイルのup側に下記のように記載してカラムのコメントを変更しようとした。

    $table->tinyInteger('カラム名')->comment('変更後のコメント')->change();
    
  2. 下記コマンドを実行してマイグレーションを実行した。

    $ php artisan migrate
    

エラー

  • 下記のエラーが出力された。

    Unknown column type "tinyinteger" requested. Any Doctrine type that you use has to be registered with \Doctrine\DBAL\Types\Type::addType(). You can get a list of all the known types with \Doctrine\DBAL\Types\Type::getTypesMap(). If this error occurs during database introspection then you might have forgotten to register all database types for a Doctrine Type. 
    Use AbstractPlatform#registerDoctrineTypeMapping() or have your custom types implement Type#getMappedDatabaseTypes(). If the type name is empty you might have a problem with the cache or forgot some mapping information.
    

原因

  • 公式ドキュメントにこんな記載を発見した。https://readouble.com/laravel/6.x/ja/migrations.html

    Note: 以降のカラムタイプのみ変更可能です:bigInteger、binary、boolean、date、dateTime、dateTimeTz、decimal、integer、json、longText、mediumText、smallInteger、string、text、time、unsignedBigInteger、unsignedInteger and unsignedSmallInteger
    
  • このドキュメントによるとTinyIntegerはchangeメソッドを用いた変更をする事ができない。

解決までの経緯

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

laravel-filemanagerをインストールするときにつまづいたこと

CKEditorを導入

参考サイト
ブログ記事等のエディタを実装する際はCKEditor!さらに便利でカッコよく使い易く!サンプルソースあり

   <textarea id="ckeditor" name="pageBody"></textarea>

    {{-- CKEditor --}}
    <script src="//cdn.ckeditor.com/4.15.0/full/ckeditor.js"></script>
    <script src="//cdnjs.cloudflare.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
    <script src="js/ckeditor.js"></script>
$(function () {
    // エディタへの設定を適用する
    CKEDITOR.replace("ckeditor", {
        uiColor: "#EEEEEE",
        height: 400,

        // スペルチェック機能OFF
        scayt_autoStartup: false,

        // Enterを押した際に改行タグを挿入
        enterMode: CKEDITOR.ENTER_BR,

        // Shift+Enterを押した際に段落タグを挿入
        shiftEnterMode: CKEDITOR.ENTER_P,

        // idやclassを指定可能にする
        allowedContent: true,

        // ファイルマネージャー関連
        filebrowserImageBrowseUrl: "/laravel-filemanager?type=Images",
        filebrowserImageUploadUrl:
            "/laravel-filemanager/upload?type=Images&_token=",
        filebrowserBrowseUrl: "/laravel-filemanager?type=Files",
        filebrowserUploadUrl: "/laravel-filemanager/upload?type=Files&_token=",

        // preコード挿入時
        format_pre: {
            element: "pre",
            attributes: {
                class: "code",
            },
        },
        // タグのパンくずリストを削除
        removePlugins: "elementspath",
        // webからコピペした際でもプレーンテキストを貼り付けるようにする
        forcePasteAsPlainText: true,
        // 自動で空白を挿入しないようにする
        fillEmptyBlocks: false,
        // タブの入力を無効にする
        tabSpaces: 0,
    });

$(function () {
    // エディタへの設定を適用する
    CKEDITOR.replace("ckeditor", {
        uiColor: "#EEEEEE",
        height: 400,

        // スペルチェック機能OFF
        scayt_autoStartup: false,

        // Enterを押した際に改行タグを挿入
        enterMode: CKEDITOR.ENTER_BR,

        // Shift+Enterを押した際に段落タグを挿入
        shiftEnterMode: CKEDITOR.ENTER_P,

        // idやclassを指定可能にする
        allowedContent: true,

        // ファイルマネージャー関連
        filebrowserImageBrowseUrl: "/laravel-filemanager?type=Images",
        filebrowserImageUploadUrl:
            "/laravel-filemanager/upload?type=Images&_token=",
        filebrowserBrowseUrl: "/laravel-filemanager?type=Files",
        filebrowserUploadUrl: "/laravel-filemanager/upload?type=Files&_token=",

        // preコード挿入時
        format_pre: {
            element: "pre",
            attributes: {
                class: "code",
            },
        },
        // タグのパンくずリストを削除
        removePlugins: "elementspath",
        // webからコピペした際でもプレーンテキストを貼り付けるようにする
        forcePasteAsPlainText: true,
        // 自動で空白を挿入しないようにする
        fillEmptyBlocks: false,
        // タブの入力を無効にする
        tabSpaces: 0,
    });
});

// 保存アイコンの無効化
CKEDITOR.plugins.registered["save"] = {
    init: function (editor) {
        var command = editor.addCommand("save", {
            modes: { wysiwyg: 1, source: 1 },
            exec: function (editor) {
                if (My.Own.CheckDirty()) My.Own.Save();
                else alert("No changes.");
            },
        });
        editor.ui.addButton("Save", { label: "", command: "save" });
    },
};
});

CKEditorに画像のアップロード機能を導入する

参考サイト
Laravelのファイル管理ライブラリ Laravel File Manager

インストールしようとするとエラーが出力された

composer require unisharp/laravel-filemanager

Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - Installation request for unisharp/laravel-filemanager ^2.2 -> satisfiable by unisharp/laravel-filemanager[v2.2.0].
    - unisharp/laravel-filemanager v2.2.0 requires ext-exif * -> the requested PHP extension exif is missing from your system.
  • PHPで画像からEXIF情報を取得するためにEXIFモジュールが必要らしい

参考サイト
docker上のPHPでEXIFを使えるようにする

DockerFileに以下を追加し再度ビルドする

RUN docker-php-ext-install exif
RUN docker-php-ext-configure exif \
            --enable-exif

もう一度インストールすると無事に成功した!

composer require unisharp/laravel-filemanager
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel-filemanagerをインストールするときにつまづいたこと

CKEditorを導入

参考サイト
ブログ記事等のエディタを実装する際はCKEditor!さらに便利でカッコよく使い易く!サンプルソースあり

   <textarea id="ckeditor" name="pageBody"></textarea>

    {{-- CKEditor --}}
    <script src="//cdn.ckeditor.com/4.15.0/full/ckeditor.js"></script>
    <script src="//cdnjs.cloudflare.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
    <script src="js/ckeditor.js"></script>
$(function () {
    // エディタへの設定を適用する
    CKEDITOR.replace("ckeditor", {
        uiColor: "#EEEEEE",
        height: 400,

        // スペルチェック機能OFF
        scayt_autoStartup: false,

        // Enterを押した際に改行タグを挿入
        enterMode: CKEDITOR.ENTER_BR,

        // Shift+Enterを押した際に段落タグを挿入
        shiftEnterMode: CKEDITOR.ENTER_P,

        // idやclassを指定可能にする
        allowedContent: true,

        // ファイルマネージャー関連
        filebrowserImageBrowseUrl: "/laravel-filemanager?type=Images",
        filebrowserImageUploadUrl:
            "/laravel-filemanager/upload?type=Images&_token=",
        filebrowserBrowseUrl: "/laravel-filemanager?type=Files",
        filebrowserUploadUrl: "/laravel-filemanager/upload?type=Files&_token=",

        // preコード挿入時
        format_pre: {
            element: "pre",
            attributes: {
                class: "code",
            },
        },
        // タグのパンくずリストを削除
        removePlugins: "elementspath",
        // webからコピペした際でもプレーンテキストを貼り付けるようにする
        forcePasteAsPlainText: true,
        // 自動で空白を挿入しないようにする
        fillEmptyBlocks: false,
        // タブの入力を無効にする
        tabSpaces: 0,
    });
};

CKEditorに画像のアップロード機能を導入する

参考サイト
Laravelのファイル管理ライブラリ Laravel File Manager

インストールしようとするとエラーが出力された

composer require unisharp/laravel-filemanager

Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - Installation request for unisharp/laravel-filemanager ^2.2 -> satisfiable by unisharp/laravel-filemanager[v2.2.0].
    - unisharp/laravel-filemanager v2.2.0 requires ext-exif * -> the requested PHP extension exif is missing from your system.
  • PHPで画像からEXIF情報を取得するためにEXIFモジュールが必要らしい

参考サイト
docker上のPHPでEXIFを使えるようにする

DockerFileに以下を追加し再度ビルドする

RUN docker-php-ext-install exif
RUN docker-php-ext-configure exif \
            --enable-exif

もう一度インストールすると無事に成功した!

composer require unisharp/laravel-filemanager
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】結局どう違うの?Eloquent, DBクラス, クエリビルダ 前編

困りごと

PHP歴3ヶ月、Laravel歴1ヶ月の初学者です。LaravelのDBの操作方法はEloquent ORM・DBクラス・クエリビルダに分類されます。表示されればなんでもOKというからレベルを一段階上げていきたい初学者がこれらの違いについてまとめました。

前編:各記述法の違いについて。(今回)
後編:どのように記述法を選択していくのか(次回)

開発環境

PHP 7.2.34 / Laravel 6.20.5

記述法を比較

①DBファザードはIlluminate\Support\Facades\DBクラスによる記述法。
②Eloquent ORMはIlluminate\Database\Eloquent\Modelクラスを継承する記述法。
それぞれ見ていきます。

①DBクラスの記述 (DBファザード)

DBクラスによる記述のためIlluminate\Support\Facades\DBをuseする。

Controller.php
 use Illuminate\Support\Facades\DB;

⭐️ DBファザード パターン①

DB::SQL値(SQL文、パラメータ配列)のように引数に直接SQL文を用いて記述する。
SQL値にはinsertやupdateなどの基本的なSQLのメソッドは揃っている。

記述例

controller.php
 public function query(Request $request) {
  //SELECT文
  $items = DB::select('select * form users where id = ?',[1]);  
  //INSERT文
  DB::insert('insert into users (id, name) values (?,?)',[1,'たかし']);
  //UPDATE文
  DB::update('update users set age = 100 where id = ?, [2]');
  //DELETE文
  DB::delete('delete from users');
 }

Laravel公式リファレンス(DBファザード)
https://readouble.com/laravel/5.dev/ja/database.html

⭐️ DBファザード パターン②

SQL文を生成するためのメソッドをメソッドチェーンで記述することによりデータベースを操作する。
DB::table('テーブル名')->メソッド()のように記述する。

記述例
・usersテーブルから、フィールド名(id)とパラメータ(requestされたid)が同じレコードを取得

Controller.php
 public function select(Request $request) {
   $items = DB::table('users')->where('id',$request->id)->first();
   return view('index',['items' => $items]);
 }
  //DB::table('テーブル名')->where('フィールド名',パラメータ)->first() 

・usersテーブルの内容をリクエストされた値へ変更(フィールド名とパラメータが同じレコードに対しての処理)

Controller.php
 public function update(request $request) {
   $param = [
     'id' => $request->id,
     'name' => $request->name,
     'comment' => $request->commment,
   ];
   DB::table('users')->where('id',$request->id)->update($param);
 }
 //DB::table('テーブル名')->where('フィール名',パラメータ)->update(パラメータ);

Laravel公式リファレンス(クエリビルダ)
https://readouble.com/laravel/5.dev/ja/queries.html

また、クエリの中で直接SQLを使用したい場合はDB::rawメソッドを使用する。

Countroller.php
$users = DB::table('users')
                  ->select(DB::raw('count(*) as count, status'))
                  ->where('status','<>',1)
                  ->groupBy('status')
                  ->get();

参考:https://readouble.com/laravel/5.7/ja/queries.html

余談ですが、

DBファサードでの insert もしくは update では created_at や updated_at は更新されません。
Eloquent を利用したときのみです。

とのことです。私はこれが原因で値が保存されずにハマったことがあります。
参考:https://laraweb.net/knowledge/2347/

②Modelクラスの記述 (Eloquent ORM)

※Eloquent ORMの基本の考え方 例:usersテーブル

①1つのクラスがDBの1テーブルに対応 $users = User::all()
②クラスの1インスタンス(オブジェクト)は、DBの1レコードに対応 $user = new User()
③クラスの属性は、テーブルの各カラムに対応 {{$user->comment}}
EloquetORM.png

⭐️ Eloquent ORM

モデルクラスによる記述のためApp\Model名をuseする。

Controller.php
use App\Models\User;    //Modelsディレクトリの配下にUserモデルを生成。

記述例
・usersテーブルの全ての値を、Collection型として取得してview(index)へ渡す

Controller.php
public function select(Request $request)
{
 $item = User::all();  
 return view('index',['items' => $items]); 
}

・usersテーブル内でリクエストされたnameフィールドと同じ値のレコードを、Collection型として取得しview(index)へ渡す。

Controller.php
public function search($Request $request) 
{
 $item = User::where($request->name)->get();  //クラス名::where(検索する値')->取得方法
 return view('index',['items' => $items]);
}

参考:
https://blog.ytake.jp.net/entry/2015/12/16/011812
https://qiita.com/gone0021/items/f1e8223c94dbaab22fca

最後に

書き方の違いについてざっくりまとめました。書き方が多くあるが故に、僕のような初学者は選択に困ってしまう部分だと思います。理解がより深まるようにメリデメについてまとめたかったのですが、長くなってきたので後編に書きます。
この内容は奥が深いようなので、実務経験を元にさらにブラッシュアップしていきます。
(本内容に誤りがありましたらご指摘いただけると幸いです。)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む