Каркас LARAVEL и модель Eloquent ORM - PullRequest
0 голосов
/ 20 декабря 2018
{ "_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 }

Выше приведена таблица 'books'

Используя фреймворк LARAVEL и модель Eloquent ORM, как вернуть следующий результат:

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

Я изучаю Laravel.

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Если структура таблицы находится под вашим контролем, то лучшим решением было бы поместить данные в две таблицы books и authors, чтобы избежать дублирования данных, как в случае с одной таблицей.

Затем определите две 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);
    }
}

Теперь вы можете использовать отношение , стремительную загрузку и небольшую обработку коллекции чтобы получить данные в вашем предпочтительном формате:

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

Вы также можете прочитать о Нормализация базы данных , а в вашем случае более конкретно 1-ая нормальная форма .

0 голосов
/ 20 декабря 2018

Вы можете использовать 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" ] }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...