{"data":{"markdownRemark":{"frontmatter":{"title":"Трюки с коллекциями в laravel","date":"10 June 2015","path":"/tryuki-s-kollekciyami-v-laravel/","author":null,"excerpt":"Несколько полезных советов по применению коллекций Laravel в процессе разработки web приложений","tags":["Laravel","Collections"],"coverImage":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAIBA//EABYBAQEBAAAAAAAAAAAAAAAAAAEAAv/aAAwDAQACEAMQAAAB4r3NKw//xAAYEAEAAwEAAAAAAAAAAAAAAAARAQIgIf/aAAgBAQABBQJY6Fsf/8QAFREBAQAAAAAAAAAAAAAAAAAAABH/2gAIAQMBAT8BiP/EABURAQEAAAAAAAAAAAAAAAAAAAAR/9oACAECAQE/Aar/xAAYEAACAwAAAAAAAAAAAAAAAAAAAREgIf/aAAgBAQAGPwLETX//xAAcEAEAAgIDAQAAAAAAAAAAAAABABEhgTFRYXH/2gAIAQEAAT8hHb8blZQm8XDrXcBrmVRA9Z//2gAMAwEAAgADAAAAEITv/8QAFREBAQAAAAAAAAAAAAAAAAAAABH/2gAIAQMBAT8QlL//xAAVEQEBAAAAAAAAAAAAAAAAAAAAEf/aAAgBAgEBPxAp/8QAHBAAAgICAwAAAAAAAAAAAAAAASEAETFhQVGB/9oACAEBAAE/ECk0FoWocqAVUZjMCHNdpFlK6qDwOhDgKs7n/9k=","aspectRatio":1.5104895104895104,"src":"/static/7549cd4f5eb853cb514422ccab2bd664/b4295/skater.jpg","srcSet":"/static/7549cd4f5eb853cb514422ccab2bd664/127d5/skater.jpg 200w,\n/static/7549cd4f5eb853cb514422ccab2bd664/7ef6a/skater.jpg 400w,\n/static/7549cd4f5eb853cb514422ccab2bd664/b4295/skater.jpg 800w,\n/static/7549cd4f5eb853cb514422ccab2bd664/487eb/skater.jpg 1080w","sizes":"(max-width: 800px) 100vw, 800px"}}}},"id":"4cd0e6df-981e-56b2-9d63-a0a66bcbe5c4","html":"<p>Коллекции бывают очень полезными но о них часто забывают. В этой статье я дам несколько советов по их применению.</p>\n<p>Вольный перевод. Оригинальная статья <a href=\"http://codebyjeff.com/blog/2015/05/stupid-collection-tricks-in-laravel\">http://codebyjeff.com/blog/2015/05/stupid-collection-tricks-in-laravel</a></p>\n<h2><strong>Внимание:</strong></h2>\n<blockquote>\n<p>Это не страница \"лучшей практики\", я всего лишь дам несколько советов которые могут быть полезны в нужном месте кода.</p>\n</blockquote>\n<p>Начнём с того, что создадим таблицу <code class=\"language-text\">people</code> и пустой класс Eloquent модели с именем Person:</p>\n<div class=\"gatsby-highlight\" data-language=\"mysql\"><pre class=\"language-mysql\"><code class=\"language-mysql\">    CREATE TABLE `people` (\n            `id` int(10) unsigned NOT NULL AUTO_INCREMENT,\n            `first_name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,\n            `last_name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,\n            `type` varchar(50) COLLATE utf8_unicode_ci NOT NULL,\n            PRIMARY KEY (`id`)\n    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;\n    \n    INSERT INTO `people` (`id`, `first_name`, `last_name`, `type`) VALUES\n            (1, &#39;Jeff&#39;, &#39;Madsen&#39;, &#39;programmer&#39;),\n            (2, &#39;Mickey&#39;, &#39;Mouse&#39;, &#39;engineer&#39;),\n            (3, &#39;Daffy&#39;, &#39;Duck&#39;, &#39;critic&#39;),\n            (4, &#39;Mighty&#39;, &#39;Mouse&#39;, &#39;programmer&#39;);\t</code></pre></div>\n<h2>Трюк #1:  find()</h2>\n<p>Что? find? Да я давно всё знаю о нём. Серьёзно? Проверим?</p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\">     <span class=\"token comment\">// Возвратит одну строку как Коллекцию</span>\n    <span class=\"token variable\">$collection</span> <span class=\"token operator\">=</span> App\\<span class=\"token package\">People</span><span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span><span class=\"token function\">find</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token function\">dd</span><span class=\"token punctuation\">(</span><span class=\"token variable\">$collection</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    \n\n    <span class=\"token comment\">// Возвратит несколько строк как Коллекции</span>\n    <span class=\"token variable\">$collection</span> <span class=\"token operator\">=</span> App\\<span class=\"token package\">Person</span><span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span><span class=\"token function\">find</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token function\">dd</span><span class=\"token punctuation\">(</span><span class=\"token variable\">$collection</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>С помощью коллекций иногда действительно приятней работать, мы всегда знаем, что возвращается коллекция.</p>\n<h2>Трюк #2: $collection->where()</h2>\n<p>Сколько запросов к базе данных вы бы произвели, что бы получить в отдельном массиве всех программистов, инженеров и критиков? Хотите сказать три? Да ни за что в жизни! Один!</p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\">    <span class=\"token comment\">// Получаем всех</span>\n    <span class=\"token variable\">$collection</span> <span class=\"token operator\">=</span> App\\<span class=\"token package\">Person</span><span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span><span class=\"token function\">all</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    \n    <span class=\"token comment\">// фильтруем</span>\n    <span class=\"token variable\">$programmers</span> <span class=\"token operator\">=</span>  <span class=\"token variable\">$collection</span><span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token function\">where</span><span class=\"token punctuation\">(</span><span class=\"token single-quoted-string string\">'type'</span><span class=\"token punctuation\">,</span> <span class=\"token single-quoted-string string\">'programmer'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token variable\">$critic</span> <span class=\"token operator\">=</span>  <span class=\"token variable\">$collection</span><span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token function\">where</span><span class=\"token punctuation\">(</span><span class=\"token single-quoted-string string\">'type'</span><span class=\"token punctuation\">,</span> <span class=\"token single-quoted-string string\">'critic'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token variable\">$engineer</span> <span class=\"token operator\">=</span>  <span class=\"token variable\">$collection</span><span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token function\">where</span><span class=\"token punctuation\">(</span><span class=\"token single-quoted-string string\">'type'</span><span class=\"token punctuation\">,</span> <span class=\"token single-quoted-string string\">'engineer'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    \n    <span class=\"token function\">dd</span><span class=\"token punctuation\">(</span><span class=\"token variable\">$engineer</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\t</code></pre></div>\n<h2>Трюк #3: where() &#x26; lists()</h2>\n<p>Возвратит массив с именами всех инженеров</p>\n<p><strong>Внимание:</strong></p>\n<blockquote>\n<p>lists в Laravel 5.2 был переименован в pluck</p>\n</blockquote>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\">    <span class=\"token variable\">$collection</span> <span class=\"token operator\">=</span> App\\<span class=\"token package\">Person</span><span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span><span class=\"token function\">all</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    \n    <span class=\"token variable\">$engineer</span> <span class=\"token operator\">=</span>  <span class=\"token variable\">$collection</span><span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token function\">where</span><span class=\"token punctuation\">(</span><span class=\"token single-quoted-string string\">'type'</span><span class=\"token punctuation\">,</span> <span class=\"token single-quoted-string string\">'engineer'</span><span class=\"token punctuation\">)</span><span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token function\">lists</span><span class=\"token punctuation\">(</span><span class=\"token single-quoted-string string\">'first_name'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// ->pluck('first_name') для laravel старше  5.1</span>\n    <span class=\"token function\">dd</span><span class=\"token punctuation\">(</span><span class=\"token variable\">$engineer</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>В WP вы вероятно сделали бы что-то вроде этого:</p>\n<p><strong>Внимание:</strong></p>\n<blockquote>\n<p>следующий код написан по памяти и не проверен</p>\n</blockquote>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\">    <span class=\"token comment\">// Получаем все метаданные для пользователя с ID  = 1</span>\n    <span class=\"token variable\">$collection</span> <span class=\"token operator\">=</span> App\\<span class=\"token package\">WP_Meta</span><span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span><span class=\"token function\">whereUserId</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    \n    <span class=\"token comment\">// Мне нужны значения имени и фамилии</span>\n    <span class=\"token variable\">$first_name</span> <span class=\"token operator\">=</span>  <span class=\"token variable\">$collection</span><span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token function\">where</span><span class=\"token punctuation\">(</span><span class=\"token single-quoted-string string\">'meta_key'</span><span class=\"token punctuation\">,</span> <span class=\"token single-quoted-string string\">'first_name'</span><span class=\"token punctuation\">)</span><span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token function\">lists</span><span class=\"token punctuation\">(</span><span class=\"token single-quoted-string string\">'value'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\t\n    <span class=\"token variable\">$last_name</span>  <span class=\"token operator\">=</span>  <span class=\"token variable\">$collection</span><span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token function\">where</span><span class=\"token punctuation\">(</span><span class=\"token single-quoted-string string\">'meta_key'</span><span class=\"token punctuation\">,</span> <span class=\"token single-quoted-string string\">'last_name'</span><span class=\"token punctuation\">)</span><span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token function\">lists</span><span class=\"token punctuation\">(</span><span class=\"token single-quoted-string string\">'value'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span>любые другие поля<span class=\"token punctuation\">,</span> которые вам нужны</code></pre></div>\n<h2>Трюк #4: $collection->implode()</h2>\n<p>Полезный метод (аналогичен php implode), объединит в строку указанный атрибут коллекции с нужным разделителем</p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\">    <span class=\"token variable\">$collection</span> <span class=\"token operator\">=</span> App\\<span class=\"token package\">Person</span><span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span><span class=\"token function\">all</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token variable\">$names</span> <span class=\"token operator\">=</span> <span class=\"token variable\">$collection</span><span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token function\">implode</span><span class=\"token punctuation\">(</span><span class=\"token single-quoted-string string\">'first_name'</span><span class=\"token punctuation\">,</span> <span class=\"token single-quoted-string string\">','</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">echo</span> <span class=\"token variable\">$names</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h2>Трюк #5: $collection->groupBy()</h2>\n<p>Мне вас жаль, если вы делали отчёты и не знали этого...</p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\">    <span class=\"token variable\">$collection</span> <span class=\"token operator\">=</span> App\\<span class=\"token package\">Person</span><span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span><span class=\"token function\">all</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token variable\">$grouped</span> <span class=\"token operator\">=</span> <span class=\"token variable\">$collection</span><span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token function\">groupBy</span><span class=\"token punctuation\">(</span><span class=\"token single-quoted-string string\">'type'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token function\">dd</span><span class=\"token punctuation\">(</span><span class=\"token variable\">$grouped</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\t\n    \n    <span class=\"token comment\">// Результат</span>\n    Collection <span class=\"token punctuation\">{</span><span class=\"token shell-comment comment\">#152 ▼</span>\n      <span class=\"token shell-comment comment\">#items: array:3 [▼</span>\n        <span class=\"token double-quoted-string string\">\"programmer\"</span> <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token keyword\">array</span><span class=\"token punctuation\">:</span><span class=\"token number\">2</span> <span class=\"token punctuation\">[</span>▼\n          <span class=\"token number\">0</span> <span class=\"token operator\">=</span><span class=\"token operator\">></span> Person <span class=\"token punctuation\">{</span><span class=\"token shell-comment comment\">#166 ▶}</span>\n          <span class=\"token number\">1</span> <span class=\"token operator\">=</span><span class=\"token operator\">></span> Person <span class=\"token punctuation\">{</span><span class=\"token shell-comment comment\">#169 ▶}</span>\n        <span class=\"token punctuation\">]</span>\n        <span class=\"token double-quoted-string string\">\"engineer\"</span> <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token keyword\">array</span><span class=\"token punctuation\">:</span><span class=\"token number\">1</span> <span class=\"token punctuation\">[</span>▼\n          <span class=\"token number\">0</span> <span class=\"token operator\">=</span><span class=\"token operator\">></span> Person <span class=\"token punctuation\">{</span><span class=\"token shell-comment comment\">#167 ▶}</span>\n        <span class=\"token punctuation\">]</span>\n        <span class=\"token double-quoted-string string\">\"critic\"</span> <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token keyword\">array</span><span class=\"token punctuation\">:</span><span class=\"token number\">1</span> <span class=\"token punctuation\">[</span>▼\n          <span class=\"token number\">0</span> <span class=\"token operator\">=</span><span class=\"token operator\">></span> Person <span class=\"token punctuation\">{</span><span class=\"token shell-comment comment\">#168 ▶}</span>\n        <span class=\"token punctuation\">]</span>\n      <span class=\"token punctuation\">]</span>\n    <span class=\"token punctuation\">}</span></code></pre></div>\n<h2>Трюк #6: Объединение</h2>\n<p>Несколько слов о коде. В примере мы будем использовать одну модель, но на самом деле предполагается это использовать для разных моделей.</p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\">    <span class=\"token keyword\">use</span> <span class=\"token package\">Illuminate<span class=\"token punctuation\">\\</span>Support<span class=\"token punctuation\">\\</span>Collection</span><span class=\"token punctuation\">;</span>\n    \n    <span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span>\n    \n    <span class=\"token comment\">// Задача в том, что бы объединить результат из различных моделей\t</span>\n    <span class=\"token variable\">$programmers</span> <span class=\"token operator\">=</span>  \\<span class=\"token package\">App<span class=\"token punctuation\">\\</span>Person</span><span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span><span class=\"token function\">where</span><span class=\"token punctuation\">(</span><span class=\"token single-quoted-string string\">'type'</span><span class=\"token punctuation\">,</span> <span class=\"token single-quoted-string string\">'programmer'</span><span class=\"token punctuation\">)</span><span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token variable\">$critic</span>      <span class=\"token operator\">=</span>  \\<span class=\"token package\">App<span class=\"token punctuation\">\\</span>Person</span><span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span><span class=\"token function\">where</span><span class=\"token punctuation\">(</span><span class=\"token single-quoted-string string\">'type'</span><span class=\"token punctuation\">,</span> <span class=\"token single-quoted-string string\">'critic'</span><span class=\"token punctuation\">)</span><span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token variable\">$engineer</span>    <span class=\"token operator\">=</span>  \\<span class=\"token package\">App<span class=\"token punctuation\">\\</span>Person</span><span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span><span class=\"token function\">where</span><span class=\"token punctuation\">(</span><span class=\"token single-quoted-string string\">'type'</span><span class=\"token punctuation\">,</span> <span class=\"token single-quoted-string string\">'engineer'</span><span class=\"token punctuation\">)</span><span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    \n    <span class=\"token variable\">$collection</span>  <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Collection</span><span class=\"token punctuation\">;</span>\n    <span class=\"token variable\">$all</span> <span class=\"token operator\">=</span> <span class=\"token variable\">$collection</span><span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token function\">merge</span><span class=\"token punctuation\">(</span><span class=\"token variable\">$programmers</span><span class=\"token punctuation\">)</span><span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token function\">merge</span><span class=\"token punctuation\">(</span><span class=\"token variable\">$critic</span><span class=\"token punctuation\">)</span><span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token function\">merge</span><span class=\"token punctuation\">(</span><span class=\"token variable\">$engineer</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token function\">dd</span><span class=\"token punctuation\">(</span><span class=\"token variable\">$all</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Теперь предостережения: Будьте осторожны с выбором что делать с результатом. Если вы будете делать циклы при сочетании экземпляров различных классов, то вас могут ожидать сюрпризы, так как некоторые поля данных не всегда могут присутствовать, или могут быть мутаторы в одной из моделей, либо и то и другое вместе. Причём сегодня это может работать нормально, а завтра кто-то придёт и добавит мутатор в модель. По этому прежде всего хорошенько рассчитайте всё.</p>\n<p>Надеюсь, что статья Вам помогла!</p>","excerpt":"Коллекции бывают очень полезными но о них часто забывают. В этой статье я дам несколько советов по их применению. Вольный перевод…"}},"pageContext":{"isCreatedByStatefulCreatePages":false,"type":"posts","next":{"frontmatter":{"path":"/kolichestvenny-analiz-slov-v-knigah-sergeya-tarmasheva-serii-hol/","title":"Количественный анализ слов в книгах Сергея Тармашева серии \"Холод\"","tags":["PHP","Я читаю"]},"fileAbsolutePath":"/srv/www/softroot.ru/src/posts/2015-03-23-kolichestvenny-analiz-slov-v-knigah-sergeya-tarmasheva-serii-hol.md"},"previous":{"frontmatter":{"path":"/kak-podruzhit-monolog-s-redis-v-lumen/","title":"Как подружить monolog с redis в lumen","tags":["Laravel","Lumen","PHP","Redis"]},"fileAbsolutePath":"/srv/www/softroot.ru/src/posts/2015-06-15-kak-podruzhit-monolog-s-redis-v-lumen.md"}}}