投稿者: admin Page 12 of 47

Laravel で 関連テーブルの数をサブクエリで数える方法

Laravel で 関連テーブルの数をサブクエリで数える方法

DB::raw を使う。

$users = User::select([
    'users.*',
    DB::raw('(SELECT COUNT(id) FROM posts)')
])->get();

他にも色々生のSQLを一部組み込めて便利。

Adobe のCreativeCloudとCS6混同の環境でCS6のPhotoShopが起動できない。

Adobe のCreativeCloudとCS6混同の環境でCS6のPhotoShopが起動できない。

とても困った。。マシン再起動しても無理。
問い合わせのTEL番号もチャットも使えない、探せない。フォーラム24h年中無休とかそんな時間ない。
と最新のPhotoshopを買って対応しようかと申し込みページいくと。あったTEL番号。→問い合わせて。

常駐アプリの CreativeCloud からログアウト、再ログインしてみて下さい。

で解決起動できた。 よくあることなのかなー

Adobe問い合わせTEL番号は、このページの下方にありました。

URL
https://www.adobe.com/jp/creativecloud/plans.html

LaravelでhasManyなテーブルの数をカウント

LaravelでhasManyなテーブルの数をカウント

Joinでまとめて取得

<?php
$users = User::join('posts','posts.user_id','=','users.id')
    ->groupBy('users.id')
    ->get(['users.id','users.name',DB::raw('count(posts.id) as posts_cnt')]);


foreach($users as $user){
    echo $user->name . '('.$user->posts_cnt.')<br>';
}

モデルのhasManyの定義を利用して取得

//Model
<?php
class User extends Model{
    public function posts(){
        return $this->hasMany("App\Post", 'user_id','id');
    }
    .   
    .   
}
//Controller and View
$users = User::get();
foreach($users as $user){
    echo $user->name . '('.$user->posts()->count().')<br>';
}

保護中: test

このコンテンツはパスワードで保護されています。閲覧するには以下にパスワードを入力してください。

LaravelでUniqの条件を追加する。

LaravelでUniqの条件を追加する。

テーブルのユニーク制約でなく、ある条件下でユニークなバリデーションの設定方法。
商品ID(サプライヤーごとでユニークを想定)

    'name' => 'required',
    'supplier_id' => 'required',
    'product_id' => [
        'alpha_numeric',
        'nullable',
        Rule::unique('products')->where(function ($query){
                $query->where('supplier_id', $supplier_id);
            })
        ],
        

カスタマイズ性が高く細かいところに手が届く感。

Laravelでアルファベット、文字列で空欄を許可したい場合。

Laravelでアルファベット、文字列で空欄を許可したい場合。

alpha_num,stringなどのバリデーションをかけつつ空欄を許可したい場合には、nullableつける必要。

    'name' => 'string|nullable'

ドキュメントにちゃんとあるので、導入時にどれだけ目を通すか悩ましい所。

“このため、バリデータがnull値が無効であると判定されないように、オプションフィールドへnullableを付ける必要がたびたび起きるでしょう。”
https://readouble.com/laravel/5.5/ja/validation.html

Laravelでカスタムバリデーションの登録方法。

[:ja]

Laravelでカスタムバリデーションの登録方法。

以下のように設定してしまったほうがだいぶ楽な感じ

1 /app/Services/CustomValidator.php クラスを作成

<?php
namespace AppServices;

class CustomValidator extends IlluminateValidationValidator
{
    
    public function validateAlphaNumeric($attribute,$value,$parameters){
        return (preg_match("/^[a-z0-9]+$/i", $value));
    }
    
    public function validateAlphabet($attribute,$value,$parameters){
        return (preg_match("/^[a-zs]+$/i", $value));
    }
}

2 app/Providers/ValidatorServiceProvider.php クラスを作成

<?php

namespace AppProviders;

use AppServicesCustomValidator;
use IlluminateSupportServiceProvider;

class ValidatorServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {
        Validator::resolver(function($translator,$data,$rules,$messages){
            return new CustomValidator($translator,$data,$rules,$messages);
        });
    }

    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

3 /config/app.php の ‘providers’ に追記

    'providers' => [
        .
        .
        .
        AppProvidersValidatorServiceProvider::class,
    ],  

4 使う

関数名がキャメルケースでValidationではスネークケース。

    public function validateAlphaNumeric($attribute,$value,$parameters){
        return (preg_match("/^[a-z0-9]+$/i", $value));
    }

という関数なら、以下のようにスネークケースで指定できる。

    'name' => 'required|alpha_numeric'

[:en]

Laravelでカスタムバリデーションの登録方法。

以下のように設定してしまったほうがだいぶ楽な感じ

1 /app/Services/CustomValidator.php クラスを作成

<?php
namespace App\Services;

use Illuminate\Validation\Validator;

class CustomValidator extends Validator
{
   
// public function validateAlphaNumeric($attribute,$value,$parameters){
//    return (preg_match("/^[a-z0-9]+$/i", $value));
// }
// 
// public function validateAlphabet($attribute,$value,$parameters){
//    return (preg_match("/^[a-zs]+$/i", $value));
// }
   
   public function validateRegulationCuts($attribute,$value,$parameters){
      
      dd($value);
      
   }
   
}

2 app/Providers/ValidatorServiceProvider.php クラスを作成

<?php

namespace App\Providers;

use App\Services\CustomValidator;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\ServiceProvider;


class ValidatorServiceProvider extends ServiceProvider
{
   /**
    * Bootstrap the application services.
    *
    * @return void
    */
   public function boot()
   {
      Validator::resolver(function($translator,$data,$rules,$messages){
         return new CustomValidator($translator,$data,$rules,$messages);
      });
   }
   
   /**
    * Register the application services.
    *
    * @return void
    */
   public function register()
   {
      //
   }
}

3 /config/app.php の ‘providers’ に追記

    'providers' => [
        .
        .
        .
        App\Providers\Validator\ServiceProvider::class,
    ],  

4 使う

関数名がキャメルケースでValidationではスネークケース。

    public function validateAlphaNumeric($attribute,$value,$parameters){
        return (preg_match("/^[a-z0-9]+$/i", $value));
    }

という関数なら、以下のようにスネークケースで指定できる。

    'name' => 'required|alpha_numeric'

[:]

LaravelのHasManyのGlobalScope(グローバルスコープ)を外す。

LaravelのHasManyのGlobalScope(グローバルスコープ)を外す。

モデルの基本的なwhere条件など(削除フラグetc)をboot()メソッドで addGlobalScopeで追加できるまではよかったが、hasManyで引っ張る時に removeGlobalScopeなんて関数がなく困った。

以下のようにhasManyを別々にして対応。もう少しスマートにできないかな。

<?php
class User extends Model
{
    
    protected static function boot()
    {
        parent::boot();
        static::addGlobalScope('スコープ名', function(Builder $builder) {
            $builder->where('delete_flg', 0);
        });
    }
    
    public function post(){
        return $this->hasMany(
            "App\Post",
            'id',
            'user_id'
        );
    }
    
    public function postAll(){
        return $this->hasMany(
            "App\Post",
            'id',
            'user_id'
        )->withoutGlobalScope('スコープ名');
    }
}

LaravelでCakePHPのbeforefind的なこと。

LaravelでCakePHPのbeforefind的なこと。

Eloquentモデルのboot()でグローバルスコープを追加。
同じテーブルだけど。モデルは別で絞って取得とか、自分が著者の生地一覧など。

<?php

namespace App;

use IlluminateDatabaseEloquentBuilder;
use IlluminateDatabaseEloquentModel;

class Work extends Model
{
    
    protected $table = 'metas';

    protected static function boot()
    {
        parent::boot();
        static::addGlobalScope('work_meta', function(Builder $builder) {
            $builder->where('type', 'work');
        });
    }
    
}

MacのbrewのPHP7.1にImagickをいれる。

MacのbrewのPHP7.1にImagickをいれる。

$ brew install php71-imagick

でインストール

$ php -S localhost:8000

でphpinfo()を書いて。テスト
http://localhost:8000 へ。

Imagick

Imagick

Page 12 of 47

Powered by WordPress & Theme by Anders Norén