【问题标题】:Laravel ORM get all books from a list of authorsLaravel ORM 从作者列表中获取所有书籍
【发布时间】:2014-06-01 17:16:23
【问题描述】:

我有一个书籍模型和一个作者模型。 book 模型有belongsTo author 关系,author hasMany book。

我有一个sql 查询,它给了我一些作者,现在我希望将所有这些作者的书放在一个列表中。

我以为我可以写:

$authors->books

但这给了我错误

Undefined property: Illuminate\Database\Eloquent\Collection::$books 

我知道如果我只有一个作者,我可以打电话给$author->books,但是如果我喜欢在这种情况下作者的集合,我怎样才能把他们所有的书放在一起呢?

【问题讨论】:

  • 不确定,但您不能遍历此集合以在每个元素上应用 ->books 吗?
  • @RoyalBg 是的,但是我如何将这些 -> 书籍保存到一个数组中,以便我得到一个包含所有书籍的数组?

标签: php sql orm laravel


【解决方案1】:

由于您要检索多个作者,Laravel 将其作为集合返回。您不能查询集合,这意味着您必须使用 foreach 来遍历它。

通过遍历集合

$allBooks = array();

foreach ($authors as $author){
    $authorBooks = $author->books->get()->toArray();
    $allBooks = array_merge($allBooks, $authorBooks);
}

我确实建议使用范围。

其他解决方案可能正在使用范围:

使用您的作者 ID 创建一个数组。使用对象时,您可以使用 ->lists('id') 。 (在本例中,我选取所有作者,但您可以使用 ->where 或范围进行限制。)

$authorids= Author::all()->lists('id');

在您的 Book 模型中创建一个 scopeAuthorIds,如下所示:

public function scopeAuthorIds($query, $ids)
{
return $query->whereIn('authorId', $ids);
}

您现在应该可以通过以下方式过滤您的图书作者 ID 了

$allBooks = Book::AuthorIds($authorids)->get();

【讨论】:

  • @Skullbox 更新了我的帖子以回答您有关将书籍添加到数组中的问题。我确实建议使用范围。
【解决方案2】:

只需使用with('books')eager loading

$authors = Author::with('books')->get();

确保您在Author 模型中具有以下功能:

public function books()
{
    return $this->hasMany('Book');
}

使用::with('Book') 将解决(减少查询)n+ 查询(称为急切加载)问题。接下来,您可以使用这样的循环:

foreach($authors as $author) {
    // Assumed you have a name property in authors table
    echo $author->name; // in blade use {{ $author->name }} to echo
    foreach($author->books as $book) {
        // Assumed you have a title property in books table
        echo $book->title; // in blade use {{ $book->title }} to echo
    }
}

如果没有循环,您可以使用以下方法从集合中获取任何模型:

// Assumed 1 is the id here in both cases
$author->find(1)->books->find(1)->title;

或者你可以使用这样的东西:

$author->first()->books->first()->title;
$author->first()->books->find(2)->title;

您可以使用get(index) 使用该项目的索引从集合中获取项目,如下所示:

// First author model and first book model
$author->get(0)->books->get(0)->title;

请记住,$author 是一个集合,$author->books 也是一个集合。你可以like this

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    • 1970-01-01
    • 2013-10-19
    • 2021-05-17
    相关资源
    最近更新 更多