1

昨日 Laravel を使い始めましたが、ORM は強力なようです。関連モデルの行を更新する方法はありますか? これは私が試したものです:

ステップ 1: データベースの正確な構造を持つ JSON オブジェクトを生成します。JSON オブジェクトには、データベース内の関係を表すサブ配列である特定のフィールドがあります。

ステップ 2: JSON オブジェクトを POST 経由で Laravel に送信して処理します。ここでややこしくなります: 最初に JSON オブジェクトを配列に変更できます。

$array = (array) $JSONobject;

今、更新する必要があります。これが機能することを期待しています:

Product::update($JSONobject->id,$array);

ただし、配列にはサブ配列があるため、実行される更新 SQL はテーブル内のサブ配列列を見つけることができず、代わりに関連するテーブルを探す必要があります。これはできますか?それとも、他のモデルも呼び出す必要がありますか?

前もって感謝します!

4

1 に答える 1

0

これは、Eloquent が処理しないものです。メソッドに提供する配列にはupdate()、この場合、Productモデルの列のみを含める必要があります。リレーションを更新するために、このようなことを試すことができます。これはすべて私の頭の上からであり、決してテストされていません。一粒の塩でそれを取ります。

$update = (array) $JSONobject;

$relations = [];

foreach ($update as $column => $value)
{
    // If the value is an array then this is actually a relation. Add it to the
    // relations array and remove it from the update array.
    if (is_array($value))
    {
        $relations[$column] = $value;

        unset($update[$column]);
    }
}

// Get the product from the database so we can then update it and update any of the
// the products relations.
$product = Product::find($update['id']);

$product->update($update);

foreach ($relations as $relation => $update)
{
    $product->{$relation}()->update($update);
}

上記のコードは、ネストされたリレーション配列のキーがリレーションの名前 (モデルで使用されるメソッド名) であることを前提としています。おそらく、これをProductモデルのメソッドにまとめることができます。次に、Product::updateRecursively($JSONobject);私は名前がひどいですが、アイデアはわかります。

これはおそらく、より複雑なリレーションでも機能しません。多対多 (またはおそらく 1 対多) のようなものについては、さらにいくつかの手順を実行する必要があります。

于 2013-04-11T12:37:28.743 に答える