Добрый день. Столкнулся с такой проблемой, что не знаю как в массиве "books" выводить только по 1 элементу. PHP: Array ( [0] => Array ( [id] => 1 [name] => Иван [surname] => Иванов [books] => Array ( [0] => Array ( [id] => 1 [title] => Книга1 [desc] => Описание1 [author_id] => 1 ) [1] => Array ( [id] => 2 [title] => Книга2 [desc] => Описание2 [author_id] => 1 ) [2] => Array ( [id] => 7 [title] => Книга4 [desc] => описание [author_id] => 1 ) ) ) [1] => Array ( [id] => 2 [name] => Александр [surname] => Александров [books] => Array ( [0] => Array ( [id] => 6 [title] => Книга3 [desc] => описание [author_id] => 2 ) [1] => Array ( [id] => 8 [title] => Книга5 [desc] => Книга5 [author_id] => 2 ) ) ) [2] => Array ( [id] => 3 [name] => Володя [surname] => описание [books] => Array ( [0] => Array ( [id] => 9 [title] => Книга6 [desc] => Книга6 [author_id] => 3 ) [1] => Array ( [id] => 10 [title] => Книга7 [desc] => Книга7 [author_id] => 3 ) ) ) ) В итоге должно получиться так: PHP: Array ( [0] => Array ( [id] => 1 [name] => Иван [surname] => Иванов [books] => Array ( [0] => Array ( [id] => 1 [title] => Книга1 [desc] => Описание1 [author_id] => 1 ) ) ) [1] => Array ( [id] => 2 [name] => Александр [surname] => Александров [books] => Array ( [0] => Array ( [id] => 6 [title] => Книга3 [desc] => описание [author_id] => 2 ) ) ) [2] => Array ( [id] => 3 [name] => Володя [surname] => описание [books] => Array ( [0] => Array ( [id] => 9 [title] => Книга6 [desc] => Книга6 [author_id] => 3 ) ) ) ) Пытался рекурсией сделать, ничего путного не получилось.
К сожалению, не знаю и это как сделать. Вызываю просто так и все. Код (Text): Author::find()->with('books')->asArray()->all();
Если нужно отобрать один элемент из 3, это делается по какому-нибудь условию. По какому в вашем случае? Вот Иван Иванов написал три книги, судя по вашему дампу, какую их них вы хотите отобрать?
Нужно оставить первую книгу у каждого автора. И по идее, чтоб это количество можно было менять, например первые два например.
Если просто первую, лично я бы плюнул, сколько их там в массиве, и выводил первую, игнорируя остальные. Ты же пользователю не дампы показывать будешь. Или задача именно так и звучит, чтоб в дампе осталась только одна книга автора, первая из добавленных? В таком случае надо мудрить, сразу не могу сказать
@alex.kot попробуй так: PHP: Author::find()->with('books')->limit(1)->asArray()->all(); меняешь цифру в limit получаешь количество.И чтобы регулировать количество просто передавай в функцию эту цифру: PHP: public function getBook($num){ Author::find()->with('books')->limit($num)->asArray()->all(); }
@mkramer у него же скорее всего две таблицы, один с автором другой с его книгами, вот когда к книгам человек прется надо задать limit 1 =), например: PHP: $userQuery = (new Query())->from('book')->limit(1)->all(); $query = new Query; $query->from('user'); $query->leftjoin(['tb' => $userQuery], "user.id = tb.book"); $result = $query->all(); То есть я предполагаю когда он пишет with('books') он уже ищет книги. Или нет? --- Добавлено --- В общем надо искать в таблице с книгами через limit(1)
@alex.kot напиши названия таблиц и названия столбцов с которыми связанны книги и автор. И конкретно написать запрос, это самый простой вариант я думаю.
Таблицы books и authors, authors.id = books.authors_id. Вот что показывает дебаггер http://prntscr.com/naeljl
Можно это по ключу сделать? Например оставить только те где ключ в books [0] и [1], а остальные удалить?
@alex.kot, нет, в базе никаких ключей массива нету. Можно только то, что реально подставить в приведённый where, к примеру, какую-нибудь дату добавления, ещё что-нибудь. И ещё раз, как звучит задача, которую ты пытаешься решить? И ты прочёл доку по Yii на русском языке?
Я имел ввиду в массиве уже удалить эти элементы. Задача такая, "получить список авторов с первыми двумя книгами этих авторов". Да, читал, я хотел это решить таким образом, только как я понял жадная загрузка так не работает. PHP: Author::find()->with([ 'books' => function ($query) { $query->limit(2); } ])->asArray()->all();
@alex.kot, так да, не работает. Ты же видел в доке, какой запрос она генерирует. Первые две - по добавлению? Я бы просто флаги поставил у самих книг тогда. Хак, конечно, но эффективный. И тогда PHP: Author::find()->with([ 'books' => function ($query) { $query->andWhere(["inFirsts" => 1]); } ])->asArray()->all(); Или другой какой признак.