0

関連が見つからない場合、nullを空の配列に置き換えることはできますか?Laravel - 関係が見つからない場合、nullを空の配列に置き換えます。

など。顧客には連絡先と契約がありますが、契約の1つにウェブがありません。私はドキュメント(Constraining Eager Loads)で読んで

$customers = Customer::with('contacts', 'contracts.web') 
     ->orderBy('company')->orderBy('prename')->get(); 

結果は以下の...

2 => array:21 [ 
    "id" => 1 
    "contacts" => array:2 [ 
    0 => array:12 [ 
     "id" => 1 
     "customer_id" => 1 
    ] 
    1 => array:12 [ 
     "id" => 2 
     "customer_id" => 1 
    ] 
    ] 
    "contracts" => array:2 [ 
    0 => array:9 [ 
     "id" => 1 
     "customer_id" => 1 
     "web" => array:7 [ 
     "id" => 1 
     "contract_id" => 1 
     ] 
    ] 
    1 => array:9 [ 
     "id" => 2 
     "customer_id" => 1 
     "web" => null // should be replaced with [] 
    ] 
    ] 
] 

ようになり、それは熱心な負荷を制約してクエリを操作するだけで可能です。それはあなたがそれが配列を返すので、私はこれをチェックし、この

を修正することができます最初の場所だから

UPDATE

契約クラス

class Contract extends Model 
{ 
    public function web() 
    { 
     return $this->hasOne(Web::class); 
    } 
} 
+0

これはおそらくあなたを助けます:http://stackoverflow.com/a/40192093/1595977 – Edwin

+0

@Edwinはあなたの助けに感謝しますが、あなたの投稿は熱心な読み込みの仕組みについてのみ説明しています。しかし、それは私の質問ではない...私の質問は、関係が見つからない場合は空の配列 –

+0

'when'を使用してすべての' web => null'を 'web = > array() 'または結果を操作するだけです。 – Edwin

答えて

2

ここでは、この種の問題を解決する方法について説明します。

hasManyリレーションでレコードが見つからない場合、Laravelは空の配列を返します。 hasOneリレーションが実装されている場合、nullが返されます。

したがって、hasOneリレーションにレコードが見つからない場合でも配列が必要な場合は、次の操作を行う必要があります。

class Contract extends Model 
{ 

    public function web() 
    { 
     return $this->hasOne(Web::class) 
      ->withDefault(function() { 
       return new Web(); 
      }); 
    } 
} 

このように実装されているため、空の配列を返すことはできません。なぜこれができないのですか?Laravel GitHub Issue Trackerのthis号を参照してください。

Eloquent関係がnull、Modelインスタンス、またはModelインスタンスのいずれかの結果に依存する既存のコードがあります。しかし、現在のwithDefault()メソッドの機能は、これら3つの期待値の1つではないオブジェクトを返す可能性を生み出します。

新しい\ stdClassを返すと、空の配列の場合は、空のWebインスタンスが返されます。空の配列を取得するには、リレーションクラスの新しいObjectをインスタンス化します。私の場合、新しいWeb();

0

はあなたの関係の方法は、これをhandeling 1でなければなりません変数がnullの場合

public class Contracts{ 

    public function web(){ 
    $collection = $this->hasMany('App\Web'); 
    return $collection ? $collection : []; 
    } 

} 
+0

そう、私はこのようにすることができます。あなたはそれをもっと楽にすることもできます。たくさんの値があるので、すべての値をマップする必要はありません。ヌルになる可能性のあるWebだけではないので、ヌルである関連性のチェックを行うことができます。よりパフォーマンスの高いソリューションがあるかどうかは不思議に思っていました。 –

+0

@llario Engler私は答えを編集しました。これはうまくいくはずです。 – Road2PreSchool

+0

私はすでにミューテータを試しましたが、sryは私の質問に言及していませんでした。これは動作しません。私は、ミューテータはリレーションシップの属性ではなく、私が間違っているなら、私を訂正してください。ご協力いただきありがとうございます! –

関連する問題