当前位置: 首页 > 知识库问答 >
问题:

Laravel关系和使用推送()方法

松铭
2023-03-14

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

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

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

  1. 将所有输入数据添加到"作者"模型
  2. 创建并保存作者模型到DB
  3. 对于每个"Book"输入数据
  4. 创建并保存每个书模型到DB使用$作者-

Laravel还指出,“有时你可能不仅希望保存一个模型,还希望保存它的所有关系。为此,您可以使用推送方法:$user-

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

我在寻找这样的东西:

$author = new Author();
$author->name = "Bill Jobs";
$author->phone = "555 - 123456";

// fill model with relations

$author->addRelation($relationsArray)

if($author->push())
{ 
   // ....
}

同样应该工作的更新"作者":首先删除已经存储的关系,比保存新的

共有3个答案

邢良才
2023-03-14

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

$book = Book::first();
$book->author->author_name = "Mark Twin";
$book->book_name = "Life On The Mississippi";
$book->push();

详情链接[1]:https://medium.com/@jinoAntony/10-隐藏-laravel-雄辩-特征-你可能不知道-efc8cc58d9e

孙星鹏
2023-03-14

对于创建多个:

$author->books()->createMany($relationsArray);

首先删除已存储的关系,然后保存新的关系

然后

$author->books()->delete(); // or if you are using soft delete forceDelete()
$author->books()->createMany($relationsArray);
丰超
2023-03-14

Eloqeunt不处理延迟的关系(比如Doctrine2),也就是说。你不能这样做:

$author = new Author;
$book = new Book;
$book->author()->associate($author);
$author->push();

因为关联是精确地完成的,所以当调用关联方法时。它所做的就是:

$child->foreign_key = $parent->primary_key;

因此,在上述情况下,主键null,因为$author尚未保存。

接下来,虽然没有说ush可以在文档中创建关联,但它可能会给人留下这样的印象,人们可能会忍不住这样做:

$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();

这一次,关系被正确分配,但仍然没有建立关联(分配外键)。因此,尽管作者和所有书籍都将被保存/更新,但它们根本不会关联。

首先:

$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

2或createMany

$booksAsArrays = Input::get('books'); // array of arrays
// validation
$author->books()->createMany($booksAsArrays); // associate and save each book

3或保存许多

$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
 类似资料:
  • 在用户和发布模型中,我创建了一个简单的关系: 职位模式: 用户模型: 在数据库i have中创建新项,例如posts表中的。在控制器中使用此代码后: 我在posts表中没有用户id信息。例如,posts表中的user_id是,我希望将子查询作为一个全用户表,其中id是1

  • 本文向大家介绍laravel ORM关联关系中的 with和whereHas用法,包括了laravel ORM关联关系中的 with和whereHas用法的使用技巧和注意事项,需要的朋友参考一下 with 渴求式预加载 可以有效的避免 N+1 问题,用法如下: 如果有多个关联关系可以用“,”隔开,还可以使用闭包来对关联关系进行限制,向下面这样: 结果会查找所有的用户,返回的每个用户信息中都会多一个

  • 我正在努力使用laravel函数 我的代码在这里: 存储时:公司存储良好,但对于公司人员,它将存储到 Larave Documentations说: 有时,您可能不仅希望保存模型,还希望保存其所有关系。为此,您可以使用推送方法: 怎么了?

  • 我已经创建了一个通知系统,所有的设置和它的工作罚款,当我发送通知到推动者。但是当我试图在私人频道上收听时,我会出错。 这是我的bootstrap.js文件laravel-echo代码 这是我的主要html的元标记内容 以下是在应用程序中侦听的代码。js 这是我在控制台上遇到的错误 邮递http://localhost:3000/broadcasting/auth 419(身份不明) 提前谢谢

  • 在Laravel中,我试图显示Auth::user(用户)和部门之间的关系元素。在用户表中,我有id、名称和部门id。在部门表中,我有id和名称。 在用户模型中,我创建 然后,在刀片模板中我尝试 Auth::user()- 但返回null,不显示链接的部门。Null不正确,所有用户都有部门。苏,有什么帮助吗?你们的关系有什么问题?

  • 问题内容: 在我自己的系统中,我有一个页面,显示从网上交易到最新交易的所有商品。 每当有人从我这里买东西时,我希望此页面自动更新。 我可以每 5 秒钟打一次电话来检查数据库中的订单,但这似乎是1980年?还是人们这样做的方式? 每当我的php newOrder() 函数( 让其 调用)被调用时,如何 将 通知 推 送到页面? __ 问题答案: 您可以在PHP中实现推送,但是它并不是最有效的解决方案