2017-02-12 1 views
5

をオブジェクトに変換、Laravelはそうのように、コレクション内の各モデルにキーを追加するこの迷惑なことを行います7 "それは私のオブジェクトの配列ですか?走る

私のコードは次のとおりです。キーを削除し、単一のコレクションにすべてのそれらの値をマージする必要がありますあなたのコレクションにflatten()を呼び出す

$obj = Cars::with('brand')->orderBy('id')->get(); 

return $obj->filter(function($value, $key) 
{ 
    return $value->display == true; 
}); 
+1

私はflatten()があなたのことをやっているかもしれないと思っていますが、この出力をどのように取得しているかを見るために、いくつかのサンプルコードを提供する必要があります。 – Dwight

+0

ええ、 'flatten()'はこのトリックを行うべきです – manniL

+1

@Dwightは - flattenが機能しました。私が受け入れる答えを自由に追加してください。 – tgun926

答えて

13

filter()メソッドは、基になるコレクション配列のキーを変更しないという問題があります。だから、コレクションはまだ配列を表すされ、それはあなたの配列は次のようになりますことだけである:

[ 
    4 => Object4, 
    7 => Object7, 
] 

これはPHPで完全に有効な配列ですが、これはJSONで適切な配列ではありません。これはJSONでは配列として表現できないため、JSONではオブジェクトに変換されます。

これをJSONで配列として正しく表現するには、Collection配列を再キーする必要があります。適切な方法はvalues()メソッドです。実行するのは、基本配列のarray_valuesです。これは、この中に上記の配列を向けるだろう。

[ 
    0 => Object4, 
    1 => Object7, 
] 

さて、これはJSONを理解することができ、代わりにオブジェクトの配列として扱われることを適切な数値添字の配列です。

flattenはこの特定のケースで使用できますが(コレクションはEloquentモデルのコレクションです)、実際には正しい方法ではなく、意図しない結果につながる可能性があります。さらに、それは必要でない余分なロジックをたくさん実行します。最良の方法は、実現しようとしているものに対して適切な方法を使用することです。それはvalues()メソッドです。

$obj = Cars::with('brand')->orderBy('id')->get(); 

return $obj->filter(function($value, $key) 
    { 
     return $value->display == true; 
    }) 
    ->values(); 
+2

ああ、@patricusが正しい - 'values'はここで使う正しい方法であり、前述のようにより効果的であるはずです。その方法を完全に忘れてしまった。これは受け入れられた答えでなければなりません。 – Dwight

関連する問題