@Pios88

Как вывести количество строк из связанной таблицы по ключевому значению?

Есть таблица book и author. Связаны через столбцы id (автора) и author_id (у книги). Нужно вывести количество книг у каждого автора. Вот такой код я написал:
class AuthorController extends Controller {
    public function actionIndex() {
        $author = Author::find()->all();
        $id = Author::find()->select('id');
        $book = Book::find()->select(['author_id' => $id])->count();
        return $this->render('index', ['author' => $author, 'book' => $book, 'id' => $id]);   
    }
}


Если в запросе Book::find() я указываю вместо переменной $id конкретное значение id автора, то получаю правильный результат, действительное число книг автора с этим id в базе. Но это не работает с переменной. В таком виде, как я указал выше, я получаю общее количество книг в базе, а не количество книг конкретного автора. Пробовал использовать foreach в этом же контроллере:
foreach ($book as $author_id) {
$book = Book::find()->select(['author_id' => $author_id])->count();
}

На выходе получаю 1,1,1,1,.... - столько единиц сколько книг в базе. Пробовал кучу других вариаций использования foreach - итог тот же: или ошибка, или столбик из единиц, или нулей, или общее количество книг а базе так же столбиком. Я уже голову сломал пытаясь разобраться как это сделать и что не так.

В представление вывожу вот так:
<?php if(!empty($author)); ?>
<?php foreach($author as $author): ?>
        <h3><a href="#"> <?=$author->name?> </a></h3>
        <h3><a href="#"> <?=$author->id?> </a></h3>
        <h3><a href="#"> <?=$book?> </a></h3>
<?php endforeach; ?>

id авторов и name выводятся корректно. Количество книг для эксперимента пробовал выводить отдельным циклом, эффект тот же.
Выручайте!
  • Вопрос задан
  • 149 просмотров
Решения вопроса 1
kimono
@kimono
Web developer
Попробуйте так:
class AuthorController extends Controller {
    public function actionIndex() {
        $authors = Author::find()->select(['author.id', 'author.name', 'books' => 'count(*)'])
            ->leftJoin('book', 'author.id = book.author_id')
            ->groupBy('author.id')->asArray()->all();
        return $this->render('index', ['authors' => $authors]);   
    }
}

view.php
foreach($authors as $author){
  echo '<h2>'.$author['id'].') '.$author['name'].'</h2>'; // 1) Иван И.И.
  echo '<p>Книг: '.$author['books'].'</p>'; // Книг: 17
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы