Вывод содержимого одной таблицы через другую таблицу

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
zxc
Сообщения: 98
Зарегистрирован: 2017.03.13, 01:06

Вывод содержимого одной таблицы через другую таблицу

Сообщение zxc »

Здравствуйте. Как осуществить вывод из таблицу author через таблицу book, где связь один ко многим (один автор на несколько книг)?
Код контроллера

Код: Выделить всё

public function actionBooks()
    {
		$authors = \app\models\Author::find()->all();
		$books = \app\models\Book::find()->with('author')->where('author_id'=>$authors->id)->all();
		//$model = \app\models\Book::find()->with('author')->where(['author_id'=>$authors->id])->all();
		//$books = \app\models\Book::find()->all();
		
		foreach ($books as $book) {
			$author = \app\models\Author::find()->where(['id'=>$book->author_id])->one();
			//$book->autname = $author->name;
		}
        return $this->render('book-list', [
			'books' => $books,
			'author' => $author,
			'authors' => $authors,
		]);
    }

zxc
Сообщения: 98
Зарегистрирован: 2017.03.13, 01:06

Re: Вывод содержимого одной таблицы через другую таблицу

Сообщение zxc »

Ошибка syntax error, unexpected '=>' (T_DOUBLE_ARROW) в строке $books = \app\models\Book::find()->with('author')->where('author_id'=>$authors->id)->all();

Krash
Сообщения: 29
Зарегистрирован: 2016.04.19, 12:43

Re: Вывод содержимого одной таблицы через другую таблицу

Сообщение Krash »

->where(['author_id'=>$authors->id])
Ну и сам $authors->id у вас вызовет ошибку, т.к. $authors - массив
Последний раз редактировалось Krash 2017.03.17, 11:32, всего редактировалось 1 раз.

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Вывод содержимого одной таблицы через другую таблицу

Сообщение zelenin »

books = \app\models\Book::find()->with('author')->where('author_id'=>$authors->id)->all();
//$model = \app\models\Book::find()->with('author')->where(['author_id'=>$authors->id])->all();

ну сравните две строки
=> - знак, использующийся для привязки ключа к значению в массиве. у вас нет массива.

zxc
Сообщения: 98
Зарегистрирован: 2017.03.13, 01:06

Re: Вывод содержимого одной таблицы через другую таблицу

Сообщение zxc »

исправил строку $books = \app\models\Book::find()->with('author')->where(['author_id'=>$authors->id])->all();

zxc
Сообщения: 98
Зарегистрирован: 2017.03.13, 01:06

Re: Вывод содержимого одной таблицы через другую таблицу

Сообщение zxc »

ошибка Trying to get property of non-object

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Вывод содержимого одной таблицы через другую таблицу

Сообщение zelenin »

перевожу: попытка получить свойство на не-объекте.
вижу одно обращение к свойству - $authors->id - и $authors не объект.
php-то надо знать хотя бы на среднем уровне, чтобы во фреймворк суваться.

zxc
Сообщения: 98
Зарегистрирован: 2017.03.13, 01:06

Re: Вывод содержимого одной таблицы через другую таблицу

Сообщение zxc »

Подскажите что делать, пожалуйста

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Вывод содержимого одной таблицы через другую таблицу

Сообщение zelenin »

zxc писал(а):
2017.03.17, 11:33
Подскажите что делать, пожалуйста
поучить php

Krash
Сообщения: 29
Зарегистрирован: 2016.04.19, 12:43

Re: Вывод содержимого одной таблицы через другую таблицу

Сообщение Krash »

zxc писал(а):
2017.03.17, 11:33
Подскажите что делать, пожалуйста
Потому что find()-all() возвращает массив. А вы пытает обратиться к нему как к объекту. Возможно, вам надо воспользоваться find()->one()

zxc
Сообщения: 98
Зарегистрирован: 2017.03.13, 01:06

Re: Вывод содержимого одной таблицы через другую таблицу

Сообщение zxc »

До этого делал вывод все работало, но я выводил с помощью цикла, что не совсем оптимально, плюс условие для сравнения id в таблице author и поле author_id в таблице book

zxc
Сообщения: 98
Зарегистрирован: 2017.03.13, 01:06

Re: Вывод содержимого одной таблицы через другую таблицу

Сообщение zxc »

Trying to get property of non-object такая же ошибка с one()

zxc
Сообщения: 98
Зарегистрирован: 2017.03.13, 01:06

Re: Вывод содержимого одной таблицы через другую таблицу

Сообщение zxc »

php обязательно подучу

caHek2x
Сообщения: 1226
Зарегистрирован: 2016.04.12, 20:41

Re: Вывод содержимого одной таблицы через другую таблицу

Сообщение caHek2x »

zxc писал(а):
2017.03.17, 11:38
Trying to get property of non-object такая же ошибка с one()
значитт one возвращает null ...

zxc
Сообщения: 98
Зарегистрирован: 2017.03.13, 01:06

Re: Вывод содержимого одной таблицы через другую таблицу

Сообщение zxc »

и так понятно, что null, мне интересно как это исправить. Framework'ом пользуюсь недавно

Аватара пользователя
Alexum
Сообщения: 681
Зарегистрирован: 2016.09.26, 10:00

Re: Вывод содержимого одной таблицы через другую таблицу

Сообщение Alexum »

zxc писал(а):
2017.03.17, 12:13
и так понятно, что null, мне интересно как это исправить. Framework'ом пользуюсь недавно
Что исправить то, что у вас запрос ничего не находит? Или проверку осилить не можете?


andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Вывод содержимого одной таблицы через другую таблицу

Сообщение andku83 »

Чтоб работал ваш подход:

Код: Выделить всё

$authors = \app\models\Author::find()->all();
if ($authors){
    $books = \app\models\Book::find()->with('author')->where(['author_id'=>$authors->id])->all();
} else {
    $book = [];
}
Но вообще у вас полная фигня написана, там достаточно сделать 2 запроса в БД:

Код: Выделить всё

public function actionBooks()
{
    $books = \app\models\Book::find()->with('author')->all();

    return $this->render('book-list', ['books' => $books]);
}
а во вью для вывода имени автора использовать:

Код: Выделить всё

foreach ($books as $book){
    $book->author->name;
}
Изучайте: http://www.elisdn.ru/blog/89/related-models-on-yii2

Onotole
Сообщения: 1808
Зарегистрирован: 2012.12.24, 12:49

Re: Вывод содержимого одной таблицы через другую таблицу

Сообщение Onotole »

shnir писал(а):
2017.03.17, 13:30
Чтоб работал ваш подход:

Код: Выделить всё

$authors = \app\models\Author::find()->all();
if ($authors){
    $books = \app\models\Book::find()->with('author')->where(['author_id'=>$authors->id])->all();
} else {
    $book = [];
}
all() возвращает массив, а вы к нему сразу как к объекту...

andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Вывод содержимого одной таблицы через другую таблицу

Сообщение andku83 »

Onotole писал(а):
2017.03.17, 13:33
all() возвращает массив, а вы к нему сразу как к объекту...
Виноват, хотел написать так, пока писал забыл добавить:

Код: Выделить всё

$authors = \app\models\Author::find()->all();
if ($authors){
    $books = \app\models\Book::find()->with('author')
    	->where(['author_id'=>ArrayHelper::getColumn($authors, 'id'])->all();
} else {
    $book = [];
}

Закрыто