投稿者: admin Page 12 of 46
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でアルファベット、文字列で空欄を許可したい場合。
alpha_num,stringなどのバリデーションをかけつつ空欄を許可したい場合には、nullableつける必要。
'name' => 'string|nullable'
ドキュメントにちゃんとあるので、導入時にどれだけ目を通すか悩ましい所。
“このため、バリデータがnull値が無効であると判定されないように、オプションフィールドへnullableを付ける必要がたびたび起きるでしょう。”
https://readouble.com/laravel/5.5/ja/validation.html
[: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(グローバルスコープ)を外す。
モデルの基本的な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的なこと。
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をいれる。
$ brew install php71-imagick
でインストール
$ php -S localhost:8000
でphpinfo()を書いて。テスト
http://localhost:8000 へ。
Windows(InternetExploler/Edge)でインターネットのSambaへのリンク(UNCリンク)を開く設定。
2017.12月現在はできました。
いろいろパスを変えてもできなかったのですが、セキュリティー設定を変更するとできました。
インターネットセキュリティーのプロパティーを開いて、[セキュリティー]タブの“信頼済サイト”に該当サイトを追加します。(サイトがhttpsでない場合はhttps必須のチェックを外す)
→InternetExploler/Edgeともこれで開けるようになります。
リンクはfile::///から初めるかたち。
<a href="file:///\exampele.compathtofile_or_dir">リンク文字列</a>
ちなみにMacは、そのままsmb://~で行けました。(iPad/iPhone/Androidなどはどうなるかは未検証
<a href="smb://exampele.com/path/to/file_or_dir">リンク文字列</a>
限定した業務システムなどでは使えそうな感じです。
Laravelで日付の検索、YYYYMMDDの形式の場合。前方後方真ん中、年月日組み合わせ検索。
をつくってみた。
public static function set_date_search($query,$date,$targetKey){
$y = ($date['year'])?'1':'0';
$m = ($date['month'])?'1':'0';
$d = ($date['day'])?'1':'0';
$ymd = ''.$y.$m.$d;
switch($ymd){
case '001':
return $query->where($targetKey,'like','______'.$date['day']);
case '011':
return $query->where($targetKey,'like','____'.$date['month'].$date['day']);
case '100':
return $query->where($targetKey,'like',$date['year'].'____');
case '110':
return $query->where($targetKey,'like',$date['year'].$date['month'].'__');
case '010':
return $query->where($targetKey,'like','____'.$date['month'].'__');
case '101':
return $query->where($targetKey,'like',$date['year'].'__'.$date['day']);
case '111':
return $query->where($targetKey,'=',dateArr2DbString($date));
default:
return $query;
}
}
PHPでいろいろな種類の改行コードを簡単に配列に格納する。のは“R” がよさそう。
参考
http://php.net/manual/ja/regexp.reference.escape.php
そのままですが。
$lines = preg_split('/R/',$text);
$textはテキストエリアなどに入力された文字を想定。
win/macどちらからでも