Php LAVEL关系和使用push()方法

Php LAVEL关系和使用push()方法,php,laravel,laravel-4,eloquent,entity-relationship,Php,Laravel,Laravel 4,Eloquent,Entity Relationship,我试图找到一种不同的方法来将给定的模型及其关系保存/更新到数据库中 基本上,我有一个“作者”页面的表单,可以在其中添加多个“书籍”。自然,“作者”和“书籍”模型有一对多的关系 根据laravel官方教程,您必须: 将所有输入数据添加到“作者”模型 创建“Author”模型并将其保存到数据库中 对于每个“书本”输入数据 使用$author->books()->save($Book)创建每个“Book”模型并将其保存到数据库中 拉雷维尔还说 但是我找不到任何关于如何用“Book”关系填充“Autho

我试图找到一种不同的方法来将给定的模型及其关系保存/更新到数据库中

基本上,我有一个“作者”页面的表单,可以在其中添加多个“书籍”。自然,“作者”和“书籍”模型有一对多的关系

根据laravel官方教程,您必须:

  • 将所有输入数据添加到“作者”模型
  • 创建“Author”模型并将其保存到数据库中
  • 对于每个“书本”输入数据
  • 使用$author->books()->save($Book)创建每个“Book”模型并将其保存到数据库中 拉雷维尔还说

    但是我找不到任何关于如何用“Book”关系填充“Author”模型以及如何使用push()方法的教程

    我在寻找这样的东西:

    $author = new Author();
    $author->name = "Bill Jobs";
    $author->phone = "555 - 123456";
    
    // fill model with relations
    
    $author->addRelation($relationsArray)
    
    if($author->push())
    { 
       // ....
    }
    
    同样,更新“作者”时也应如此:首先删除已存储的关系,然后保存新关系,以便创建多个:

    $author->books()->createMany($relationsArray);
    
    首先删除已存储的关系,然后保存新的关系

    然后

    对于创建多个:

    $author->books()->createMany($relationsArray);
    
    首先删除已存储的关系,然后保存新的关系

    然后

    太长,读不下去了您将在下面找到
    push
    说明,以及
    createMany
    saveMany
    关系方法之间的区别 Eloqeunt不处理延迟关系(例如Doctrine2),即,您不能这样做:

    $author = new Author;
    $book = new Book;
    $book->author()->associate($author);
    $author->push();
    
    因为关联是精确完成的,所以当您调用
    associate
    方法时。它所做的就是:

    $child->foreign_key = $parent->primary_key;
    
    因此,在上述情况下,
    主键
    null
    ,因为
    $author
    尚未保存


    接下来,虽然
    push
    并不是说可以在文档中创建关联,但它可能会给人留下这样的印象,人们可能会尝试这样做:

    $author = Author::first(); // existing parent
    $books = Book::get(); // existing children collection
    
    $author->books = $books;
    $author->push();
    
    然而,这将不起作用。首先,Eloquent不允许您显式地分配关系,如上所述,然后,即使您正确地分配关系,也不会建立关联:

    $author = Author::first();
    $books = Book::get(); 
    
    $author->setRelation('books', $books);
    $author->push();
    
    这一次,关系被正确分配,但仍然没有建立关联(分配外键)。因此,尽管
    作者
    和所有
    书籍
    都将被保存/更新,但它们根本不会关联


    也就是说,您需要自己关联模型,并使用
    push
    或利用雄辩的方法(
    createMany
    /
    saveMany
    ): 首先:

    $author = Author::find($someId);
    // delete existing books
    $author->books()->delete();
    
    1然后手动

    // for example:
    $booksInput = Input::get('books');
      // validate etc
    foreach ($booksInput as $bookArray)
    {
      $book = new Book;
      // assign the value from, eg.
      $book->fill($bookArray);
      $book->author()->associate($author);
      // or set FK explicitly
      $book->author_id = $author->getKey();
    
      // add to the author's collection
      $author->books->add($book);
    }
    
    $author->push(); // saves author and each of the books in separate queries
    
    $booksAsArrays = Input::get('books'); // array of arrays
    // validation
    $author->books()->createMany($booksAsArrays); // associate and save each book
    
    $booksAsModels = []; // array of Book models
    $booksAsArrays = Input::get('books'); // array of arrays
    // validation
    
    foreach ($booksAsArrays as $bookArray)
    {
      $booksAsModels[] = new Book($bookArray);
    }
    $author->books()->saveMany($booksAsModels); // associate and save each book
    
    2或
    createMany

    // for example:
    $booksInput = Input::get('books');
      // validate etc
    foreach ($booksInput as $bookArray)
    {
      $book = new Book;
      // assign the value from, eg.
      $book->fill($bookArray);
      $book->author()->associate($author);
      // or set FK explicitly
      $book->author_id = $author->getKey();
    
      // add to the author's collection
      $author->books->add($book);
    }
    
    $author->push(); // saves author and each of the books in separate queries
    
    $booksAsArrays = Input::get('books'); // array of arrays
    // validation
    $author->books()->createMany($booksAsArrays); // associate and save each book
    
    $booksAsModels = []; // array of Book models
    $booksAsArrays = Input::get('books'); // array of arrays
    // validation
    
    foreach ($booksAsArrays as $bookArray)
    {
      $booksAsModels[] = new Book($bookArray);
    }
    $author->books()->saveMany($booksAsModels); // associate and save each book
    
    3或
    saveMany

    // for example:
    $booksInput = Input::get('books');
      // validate etc
    foreach ($booksInput as $bookArray)
    {
      $book = new Book;
      // assign the value from, eg.
      $book->fill($bookArray);
      $book->author()->associate($author);
      // or set FK explicitly
      $book->author_id = $author->getKey();
    
      // add to the author's collection
      $author->books->add($book);
    }
    
    $author->push(); // saves author and each of the books in separate queries
    
    $booksAsArrays = Input::get('books'); // array of arrays
    // validation
    $author->books()->createMany($booksAsArrays); // associate and save each book
    
    $booksAsModels = []; // array of Book models
    $booksAsArrays = Input::get('books'); // array of arrays
    // validation
    
    foreach ($booksAsArrays as $bookArray)
    {
      $booksAsModels[] = new Book($bookArray);
    }
    $author->books()->saveMany($booksAsModels); // associate and save each book
    
    太长,读不下去了您将在下面找到
    push
    说明,以及
    createMany
    saveMany
    关系方法之间的区别 Eloqeunt不处理延迟关系(例如Doctrine2),即,您不能这样做:

    $author = new Author;
    $book = new Book;
    $book->author()->associate($author);
    $author->push();
    
    因为关联是精确完成的,所以当您调用
    associate
    方法时。它所做的就是:

    $child->foreign_key = $parent->primary_key;
    
    因此,在上述情况下,
    主键
    null
    ,因为
    $author
    尚未保存


    接下来,虽然
    push
    并不是说可以在文档中创建关联,但它可能会给人留下这样的印象,人们可能会尝试这样做:

    $author = Author::first(); // existing parent
    $books = Book::get(); // existing children collection
    
    $author->books = $books;
    $author->push();
    
    然而,这将不起作用。首先,Eloquent不允许您显式地分配关系,如上所述,然后,即使您正确地分配关系,也不会建立关联:

    $author = Author::first();
    $books = Book::get(); 
    
    $author->setRelation('books', $books);
    $author->push();
    
    这一次,关系被正确分配,但仍然没有建立关联(分配外键)。因此,尽管
    作者
    和所有
    书籍
    都将被保存/更新,但它们根本不会关联


    也就是说,您需要自己关联模型,并使用
    push
    或利用雄辩的方法(
    createMany
    /
    saveMany
    ): 首先:

    $author = Author::find($someId);
    // delete existing books
    $author->books()->delete();
    
    1然后手动

    // for example:
    $booksInput = Input::get('books');
      // validate etc
    foreach ($booksInput as $bookArray)
    {
      $book = new Book;
      // assign the value from, eg.
      $book->fill($bookArray);
      $book->author()->associate($author);
      // or set FK explicitly
      $book->author_id = $author->getKey();
    
      // add to the author's collection
      $author->books->add($book);
    }
    
    $author->push(); // saves author and each of the books in separate queries
    
    $booksAsArrays = Input::get('books'); // array of arrays
    // validation
    $author->books()->createMany($booksAsArrays); // associate and save each book
    
    $booksAsModels = []; // array of Book models
    $booksAsArrays = Input::get('books'); // array of arrays
    // validation
    
    foreach ($booksAsArrays as $bookArray)
    {
      $booksAsModels[] = new Book($bookArray);
    }
    $author->books()->saveMany($booksAsModels); // associate and save each book
    
    2或
    createMany

    // for example:
    $booksInput = Input::get('books');
      // validate etc
    foreach ($booksInput as $bookArray)
    {
      $book = new Book;
      // assign the value from, eg.
      $book->fill($bookArray);
      $book->author()->associate($author);
      // or set FK explicitly
      $book->author_id = $author->getKey();
    
      // add to the author's collection
      $author->books->add($book);
    }
    
    $author->push(); // saves author and each of the books in separate queries
    
    $booksAsArrays = Input::get('books'); // array of arrays
    // validation
    $author->books()->createMany($booksAsArrays); // associate and save each book
    
    $booksAsModels = []; // array of Book models
    $booksAsArrays = Input::get('books'); // array of arrays
    // validation
    
    foreach ($booksAsArrays as $bookArray)
    {
      $booksAsModels[] = new Book($bookArray);
    }
    $author->books()->saveMany($booksAsModels); // associate and save each book
    
    3或
    saveMany

    // for example:
    $booksInput = Input::get('books');
      // validate etc
    foreach ($booksInput as $bookArray)
    {
      $book = new Book;
      // assign the value from, eg.
      $book->fill($bookArray);
      $book->author()->associate($author);
      // or set FK explicitly
      $book->author_id = $author->getKey();
    
      // add to the author's collection
      $author->books->add($book);
    }
    
    $author->push(); // saves author and each of the books in separate queries
    
    $booksAsArrays = Input::get('books'); // array of arrays
    // validation
    $author->books()->createMany($booksAsArrays); // associate and save each book
    
    $booksAsModels = []; // array of Book models
    $booksAsArrays = Input::get('books'); // array of arrays
    // validation
    
    foreach ($booksAsArrays as $bookArray)
    {
      $booksAsModels[] = new Book($bookArray);
    }
    $author->books()->saveMany($booksAsModels); // associate and save each book
    

    您可以使用推送方法更新图书和作者模型

    $book = Book::first();
    $book->author->author_name = "Mark Twin";
    $book->book_name = "Life On The Mississippi";
    $book->push();
    
    这里是详细信息的链接
    [1] :

    您可以使用推送方法更新图书和作者模型

    $book = Book::first();
    $book->author->author_name = "Mark Twin";
    $book->book_name = "Life On The Mississippi";
    $book->push();
    
    这里是详细信息的链接 [1] :