[Laravel8.16.0] validationの:attributesの名前が重複する時

attributesでユーザ作成時にnameを「ユーザ名」と設定済みだが、商品登録時にnameを「商品名」と使いたい時。
-> requestの方で、attributeを設定すると、上書きされる。

resources/lang/ja/validation.php

'attributes' => [
        'name'=>'ユーザ名',
    ],

app/Http/Requests/CreateProductRequest.php

public function rules()
    {
        return [
            //
            'name' => ['required'],
        ];
    }

    public function attributes()
    {
        return [
            'name'           => '商品名',
        ];
    }

こうすると、商品登録時にnameでエラーとなった場合に、きちんと「商品名」で表示される。

なるほど、データベースの設計書も作成して作り始めてるのに、今更データベース側のカラム名を変更なんてやってられない。上手くできている。

[Laravel8.16.0]disabledのフォームでバリデーションエラー時に値が消える時

以下のようにLaravel Collectiveでフォームを書いてます。
ユーザに編集して欲しくない値は、’disabled’=>’disabled’属性を付けています。

{!! Form::label('company', '会社名') !!} <span class="badge badge-secondary">必須</span>
{!! Form::text('company', null, ['class' => 'form-control col-md-12', 'disabled'=>'disabled']) !!}

これだと、form送信時にdisabled属性の値は送信されないので、バリデーションエラー時に、空欄になってしまいます。

### 解決法
-> hiddenをつける

<input type="hidden" name="company" value="{{ $client['company'] }}">
{!! Form::label('company', '会社名') !!} <span class="badge badge-secondary">必須</span>
{!! Form::text('company', null, ['class' => 'form-control col-md-12', 'disabled'=>'disabled']) !!}

この事象に関するドキュメントがないから丸一日悩んだけど、あっさり解決した。。

[Laravel8.16.0] 階層化したwhereHas(belongTo2回)のwhereを検索したい

1. 注文のModel
L 商品のModelにbelongToしている
app/Models/Order.php

    public function product1(){
        return $this->belongsTo('App\Models\Product', 'product_id1', 'id');
    }

2. 商品のModel
L カテゴリーのModelにbelongToしている
app/Models/Product.php

public function category(){
        return $this->belongsTo('App\Models\Category');
    }

3. この状態で、注文一覧、カテゴリー名の検索をしたい。
belongToの検索はwhereHasなので、whereHasを階層化する。
なお、検索ワードはGetメソッドで取得して、変数としてwhereHasに渡す。
controller

$query = '検索ワード';
        $orders = Order::whereHas('product1', function($q1) use($query){
		    $q1->whereHas('category', function($q2) use($query){
			    $q2->where('company', 'like', '%'.$query.'%');
			});
		})->get();

whereHasのqueryを更にwhereHasとする。
これで行ける。

これをOrWhereHasで更に繋げる。
そして、日付の検索条件(whereBetween, whereDate)も加える。
吐きそう。。🤑🤑🤑

[Laravel8.16.0] belongToリレーション先の値をwhereで検索

### whereHas
app/Models/Order.php

public function product1(){
        return $this->belongsTo('App\Models\Product', 'product_id1', 'id');
    }

controller

$orders = Order::whereHas('product1', function($q){
		    $q->where('name', 'like', '%車%');
		})->get();
        dd($orders);

### orWhreHas
複数のbelongsToがある場合
app/Models/Order.php

    public function product1(){
        return $this->belongsTo('App\Models\Product', 'product_id1', 'id');
    }
    public function product2(){
        return $this->belongsTo('App\Models\Product', 'product_id2', 'id');
    }

controller

$orders = Order::whereHas('product1', function($q){
		    $q->where('name', 'like', '%セット%');
		})->orWhereHas('product2', function($q){
		    $q->where('name', 'like', '%セット%');
		})->get();
        dd($orders);

OK
で、本当にやりたいのは、whrehasを2階層にしたものをorWhreHasで回したい。できるのか。。。。

[PHP 7.4.11] 先頭からの0取り処理(0埋め処理の逆)

0埋め処理(sprintf)とは逆に、文字列先頭からの0取り処理を実装したい。

### intにキャスト

$str = "000001";
echo (int)$str;

-> 1

### ltrim();
左端の空白を削除、第二引数で指定した文字を削除

$str = "00000222";
echo ltrim($str, 0);

-> 222

### abs();
絶対値を取得

$str = "0000033";
echo abs($str);

-> 33

int変換だと、$strの値に数値以外の値が入っていた時に、”0″と出力されてしまうので、ltrim();を使うか。
割と奥行きのあるテーマだ。

[bootstrap] cardでリンクを貼る方法

公式サイトのサンプルでテストします。

<a href="/test.html">
		<div class="card" style="width: 18rem;">
            <svg class="bd-placeholder-img card-img-top" width="100%" height="180" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMidYMid slice" focusable="false" role="img" aria-label="Placeholder: Image cap"><title>Placeholder</title><rect fill="#868e96" width="100%" height="100%"/><text fill="#dee2e6" dy=".3em" x="50%" y="50%">Image cap</text></svg>
            <div class="card-body">
                <h5 class="cart-title">Cart Title</h5>
                <p class="card-text">Some quick example text to build on the card title and make up the bulk of the card's content.</p>
                <a href="#" class="btn btn-primary">Go somewhere</a>
            </div>
        </div>
        </a>

普通にaタグで囲うだけでOKです。

[Laravel8.16.0] bladeでbelongsToの呼び出しを複数繋げる

こういうbelongTo->belongToが出来るのか試したが、結論から言うと出来る。

<p>{{ $orders->product->category->name }}</p>

model: productがcategoryのbelongTo

public function category(){
        return $this->belongsTo('App\Models\Category');
    }

model: orderがproductのbelongTo

public function product(){
        return $this->belongsTo('App\Models\Product', );
    }

良かったー 死ぬかと思った。。

[CSS] position:stickyで固定表示したい時

    <style>
    	table {
            width: 100%;
        }
        th, td {
            height: 300px;
            vertical-align: middle;
            padding: 0 15px;
            border: 1px solid #ccc;
        }
        .fixed01 {
            position: sticky;
            top: 0;
            color: #FFF;
            background: #333;
            &:before{
                content: "";
                position: absolute;
                top: -1px;
                left: -1px;
                width: 100%;
                height: 100%;
                border: 1px solid #ccc;
            }
        }
    </style>
</head>
<body>
	<div class="container">
		<table>
            <tr>
                <th class="fixed01">見出し</th>
                <th class="fixed01">見出し</th>
                <th class="fixed01">見出し</th>
            </tr>
            <tr>
                <td>テキスト</td>
                <td>テキスト</td>
                <td>テキスト</td>
            </tr>
            <tr>
                <td>テキスト</td>
                <td>テキスト</td>
                <td>テキスト</td>
            </tr>
        </table>
	</div>

「position: sticky;」は「指定された場所までいくと固定」される仕様

なるほど。。