すべての属性がnullであっても、Laravelでモデルを取得する方法はありますか?nullでない属性を持つモデルのみを返すようです。
これは、モデルに属性が存在する場合、配列からモデルの属性を更新する関数があるためです。 property_exists()関数を使用して、設定する前にモデルに特定の属性があるかどうかを確認します。配列キーとモデル属性は一致することが期待されているため、このように機能します。
属性が存在し、配列から値を取得するため、モデルにすでに属性が設定されている場合は正常に機能します。ただし、property_exists()チェックに失敗するため、属性が以前にnullだった場合、何も更新または設定されません。
最終的に起こっているのは、属性の単一の配列と、おそらく2つのモデルがあることです。そして、セッター関数を実行し、属性配列と各オブジェクトを別々の呼び出しで渡します。モデルに一致するプロパティがある場合、モデルは更新されます。
これを行うには2つの方法があります。 1つの方法は、モデルでデフォルトの属性値を定義することです。
_protected $attributes = ['column1' => null, 'column2' => 2];
_
次に、getAttributes()
メソッドを使用して、モデルの属性を取得できます。
ただし、デフォルトの属性を設定したくない場合は、簡単に機能するメソッドを作成しました。
_public function getAllAttributes()
{
$columns = $this->getFillable();
// Another option is to get all columns for the table like so:
// $columns = \Schema::getColumnListing($this->table);
// but it's safer to just get the fillable fields
$attributes = $this->getAttributes();
foreach ($columns as $column)
{
if (!array_key_exists($column, $attributes))
{
$attributes[$column] = null;
}
}
return $attributes;
}
_
基本的に、属性が設定されていない場合、これはその属性にnull値を追加し、それを配列として返します。
$model->getAttributes();
上記は生の属性の配列を返します(データベーステーブルに格納されている)
$model->toArray()
上記は、すべてのモデルの未加工の属性、変更された属性(使用されている場合)、および追加された属性を返します
お役に立てば幸いです!!
更新:
次のようにインスタンス化した後にこれを実行しようとしている場合:
_$model = new Model;
_
それからトーマス・キムの答えとは違ってください。
それ以外の場合:モデルインスタンスでtoArray()
またはgetArributes()
メソッドを使用すると、nullを含むすべての属性が返されます。その後、_array_key_exists
_を使用して確認できます。
そのようです:
_if (array_key_exists('foo', $model->getAttributes())) {
$model->foo = 'new value';
}
_
戻すすべてのフィールドを明示的に宣言した場合はどうなりますか。
public function getSomeModelFromArray(Request $request)
{
// This will only give back the columns/attributes that have data.
// NULL values will be omitted doing it this way.
//$model = $request->all();
// However by declaring all the attributes I want I can get back
// columns even if the value is null. Additional filtering can be
// added on if you still want/need to massage the data.
$model = $request->all([
'id',
'attr1',
'attr2',
'attr3',
//...
]);
//...
return $model;
}
かなり一般的な例ですが、うまくいけば誰かがこれを役に立つと思うでしょう。