web-dev-qa-db-ja.com

雄弁な関係-Has Manyにアタッチ(ただし保存しない)

次の関係を設定しています。

class Page {
    public function comments() {
        return $this->hasMany('Comment');
    }
}

class Comment {
    public function page() {
        return $this->belongsTo('Page');
    }
}

かなり沼地の標準。 1つのページに多数のコメントを含めることができ、1つのコメントは1つのページに属します。

新しいページを作成できるようにしたい:

$page = new Page;

そしてコメント

$comment = new Comment;

そして、ページにコメントを添付しますそれを保存せずに

$page->comments->associate($comment);

私は以下を試しました:

// These are for one-to-many from the MANY side (eg. $comment->page->associate...)
$page->comments->associate($comment);   // Call to undefined method Illuminate\Database\Eloquent\Collection::associate()
$page->comments()->associate($comment); // Call to undefined method Illuminate\Database\Query\Builder::associate()

// These 2 are for many-to-many relations, so don't work
$page->comments->attach($comment);      // Call to undefined method Illuminate\Database\Eloquent\Collection::attach()
$page->comments()->attach($comment);    // Call to undefined method Illuminate\Database\Query\Builder::attach()

// These 2 will (if successful) save to the DB, which I don't want
$page->comments->save($comment);        // Call to undefined method Illuminate\Database\Eloquent\Collection::save()
$page->comments()->save($comment);      // Integrity constraint violation: 1048 Column 'page_id' cannot be null

本当に奇妙なことは、反対のこと(ページをコメントに添付すること)が正しく機能することです。

$comment->page()->associate($page);

関連するドキュメントは here ですが、1対多のONE側にアタッチすることについては言及されていません。可能ですか? (あるべきだと思う)

20
Joe

新しいコメントオブジェクトをページのコメントコレクションに追加したいだけのようですが、基本的なコレクション追加メソッドを使用して簡単に行うことができます。

$page = new Page;
$comment = new Comment;
$page->comments->add($comment);
26
Benubird

リンクするIDがないため、実行できません。

したがって、最初に親を保存する必要があります($page)次に、子モデルを保存します。

// $page is existing model, $comment don't need to be
$page->comments()->save($comment); // saves the comment

または逆に、今回は保存せずに:

// again $page exists, $comment don't need to
$comment->page()->associate($page); // doesn't save the comment yet
$comment->save();
8
Jarek Tkaczyk

benubirdによると、私は今日これにつまずいたときに何かを追加したかっただけです:

Benubirdが述べたように、コレクションに対してaddメソッドを呼び出すことができます。 edpaaz(追加の発生したクエリ)の懸念を考慮するために、私はこれを行いました:

$collection = $page->comments()->getEager(); // Will return the eager collection
$collection->add($comment) // Add comment to collection

私が見る限り、relation-objectのみを使用しているので、これは追加のクエリを防ぎます。

私の場合、エンティティの1つは永続的でしたが、最初の(ケースページで)は永続的ではありませんでした(そして作成される予定でした)。いくつかのことを処理する必要があり、これをオブジェクトの方法で処理したいので、永続エンティティオブジェクトを非永続オブジェクトに追加したいと考えました。ただし、両方の非永続性でも機能するはずです。

Benubirdに正しい方向を教えてくれてありがとう。私の追加が私のためにしたように誰かを助けることを願っています。

これが私の最初のstackoverflow投稿であることを覚えておいてください。少し心配してフィードバックを残してください。

4
Julius Blatt