【问题标题】:LARAVEL framework and Eloquent ORM modelLARAVEL 框架和 Eloquent ORM 模型
【发布时间】:2019-05-21 03:39:46
【问题描述】:
{ "_id" : 8751, "title" : "The Banquet", "author" : "Dante", "copies" : 2 }
{ "_id" : 8752, "title" : "Divine Comedy", "author" : "Dante", "copies" : 1 }
{ "_id" : 8645, "title" : "Eclogues", "author" : "Dante", "copies" : 2 }
{ "_id" : 7000, "title" : "The Odyssey", "author" : "Homer", "copies" : 10 }
{ "_id" : 7020, "title" : "Iliad", "author" : "Homer", "copies" : 10 }

上面是一个“书”表

使用 LARAVEL 框架和 Eloquent ORM 模型,如何返回如下结果:

{ "author" : "Homer", "books" : [ "The Odyssey", "Iliad" ] }
{ "author" : "Dante", "books" : [ "The Banquet", "Divine Comedy", "Eclogues" ] }

我正在学习 Laravel。

【问题讨论】:

标签: laravel orm eloquent


【解决方案1】:

您可以使用GROUP_CONCAT

Book::groupBy('author')
    ->select(DB::raw('GROUP_CONCAT(title) as books'), 'author')
    ->get()
    ->map(function ($author) {
        $author->books = preg_split('/,/', $author->books);
        return $author;
    });

这会让你:

{ "author" : "Homer", "books" : [ "The Odyssey", "Iliad" ] }
{ "author" : "Dante", "books" : [ "The Banquet", "Divine Comedy", "Eclogues" ] }

【讨论】:

  • 我需要得到完全相同的输出
  • 就像我说的,你只需要添加一个拆分器然后......我已经更新了我的答案以匹配你的输出。
【解决方案2】:

如果表结构在您的控制范围内,那么更好的解决方案是将数据放入两个表 booksauthors,以避免数据重复,就像现在使用单个表一样。

然后定义两个Eloquent Models,并建立一个一对多的关系。正如一个作者可以写许多本书。

所以Book 模型可能如下所示:

class Book extends Model
{
    public function author()
    {
        return $this->belongsTo(Author::class);
    }
}

Author 模型可能如下所示:

class Author extends Model
{
    public function books()
    {
        return $this->hasMany(Book::class);
    }
}

现在您可以使用relationshipeager loading 和一点点collection processing 以您喜欢的格式获取数据:

$authors = Author::with('books')->get()->map(function ($author) {
    return [
        'author' => $author->name,
        'books'  => $author->books->pluck('title')
    ];
});

您可能还想阅读Database Normalization,在您的情况下更具体地说是The 1st Normal Form

【讨论】:

    猜你喜欢
    • 2016-02-04
    • 1970-01-01
    • 1970-01-01
    • 2012-12-10
    • 2014-08-23
    • 2015-10-29
    • 1970-01-01
    • 1970-01-01
    • 2013-02-12
    相关资源
    最近更新 更多