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

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про 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
Сообщения: 1240
Зарегистрирован: 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
Сообщения: 683
Зарегистрирован: 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 = [];
}
Закрыто