Как объединить некоторые записи?

Рейтинг: 0Ответов: 1Опубликовано: 07.03.2015

При выборке из бд выходит, что на 1 запись одной таблицы приходится 1-n записей из другой.

author | id | name
         1    Василий
         2    Петров
         3    Николаев

books  | id | title
         1    матан
         2    химия

book_author   id_book  |  id_author
                 1           1
                 1           3
                 2           2

При выборке выходит следующий объект:

foreach($model as $row)
{
    echo $row['title_ru']." -- ".$row['fio_ru']."<br>";  
}
  1. матан => Василий
  2. матан => Николаев
  3. химия => Петров

Вопрос, как сделать выборку, чтобы было:

 1. матан => [Василий,Петров]
 2. химия => [петров]

Я потом хочу оформить как

 1.  матан  | Василий,Николаев 
 2.  химия  | Петров

Код выборки данных:

$model = Tutorials::findBySql('SELECT title_ru,fio_ru
           FROM Tutorials AS t
            INNER JOIN author_tutorial as at ON t.id = at.id_tutorial
             INNER JOIN Lectors as l ON l.id = at.id_author')->asArray()->all();

Ответы

▲ 1Принят

Через ActiveRecord, которая специально создана, чтобы не писать вручную джойны (писалось с документации, где-то могут быть косяки):

namespace app\models;
class Author
{
    ...
    public function __toString()
    {
        return $this->name;
    }
    public function getBooks()
    {
        return $this->hasMany(Book::className(), ['id' => 'id_book'])->viaTable('author_book_relationship', ['id_author' => 'id']);
    }
    ...
}

namespace app\models;
class Book
{
    ...
    public function getAuthors()
    {
        return $this->hasMany(Author::className(), ['id' => 'id_author'])->viaTable('author_book_relationship', ['id_book' => 'id']);
    }
    ...
}

...

foreach (Book::findAll() as $book) {
    echo sprintf(
        '%s | %s',
        $book->title,
        implode(', ', $book->getAuthors())
    );
}