query https://dev.drupal.cz/ cs Na co si dát pozor při alteraci SelectQuery https://dev.drupal.cz/clanky/na-co-si-dat-pozor-pri-alteraci-selectquery <span class="field field--name-title field--type-string field--label-hidden">Na co si dát pozor při alteraci SelectQuery</span> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>Toto je jen stručný článek pro vývojáře, kteří potřebují v Drupalu 7 či 8 alterovat SQL query. Pokud mu nebudete rozumět, nezoufejte, možná není pro vás.</p> <p>Při práci na alterování SQL query jsem narazil na neočekávané chování některých metod, které ač se zdají být zcela pasivní, mají nečekané důsledky.</p> <p>Hooky pro query alter slouží k tomu, abychom mohli již vytvořený SelectQuery objekt modifikovat, např. joinovat další tabulku, nebo častěji upravit podmínky, které se nacházejí v části za WHERE, a to těsně před tím, než je query provedena a vytvořený SQL dotaz zaslán na MySQL (či jiný) server.</p> <p>Pokud ovšem před modifikací query použijete některou z následujících funkcí</p> <p><span><strong>$query-&gt;__toString()</strong>, např. ve spojení s print($query-&gt;__toString()) pro výpis vzniklého dotazu,</span> nebo<br /><strong><em>$query</em><span>-&gt;</span><span>getArguments</span>()</strong>, pro zjištění, jaké jsou v query argumenty (to jsou ty proměnné označované jako <em>:db_placeholder_x</em>),</p> <p>budete překvapeni nečekanými výsledky. Jakmile totiž funkci <strong><span>getArguments</span></strong><span> použijete v domnění, že vám pouze vrátí argumenty, nevšimnete si, že funkce k vrácení argumentů potřebuje </span>SelectQuery<span> objekt nejprve zkompilovat.</span> Pokud pak provedete požadované změny v SelectQuery objektu, např. změníte podmínku, nemá tato změna efekt, protože query je již zkompilována. Můžete se pak dostat do situace, že kód, který by měl normálně fungovat a vy v něm nevidíte žádnou chybu, prostě nefunguje. S funkcí <span>__toString() je to podobné. </span></p> <p><span>Pro vývojáře je podstatný fakt, že tyto funkce nečekaně mění výsledky kódu, a to i přesto, že podle svých názvů působí zcela pasivně, pouze jako něco, co má získat data či zkonvertovat </span>SelectQuery objekt<span> do řetězce.</span></p> <p>Příklad:</p> <p><code>/**<br /> * Implements hook_query_TAG_alter().<br /> */<br /> function hook_query_TAG_alter(QueryAlterableInterface &amp;$query) {<br />   /** @var \SelectQuery $query */<br />  <br />   // S následují řádkou nebude mít další kód žádný efekt.<br />   <strong>$query_argumants = $query-&gt;getArguments();</strong><br />  <br />   $conditions = &amp;$query-&gt;conditions();<br />   /** @var \DatabaseCondition $condition_field */<br />   $condition_field = &amp;$conditions[0]['field'];<br />   $inner_conditions = &amp;$condition_field-&gt;conditions();<br />  <br />   // Zde si představte konkrétní manipulace s conditions...<br /> }</code></p> <p> </p> <p> </p></div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><a title="Zobrazit profil uživatele." href="/user/martinklima" class="username">martin_klima</a></span> <span class="field field--name-created field--type-created field--label-hidden">Út, 03/20/2018 - 17:48</span> <div class="field field--name-field-tags field--type-entity-reference field--label-hidden field__items"> <div class="field__item"><a href="/stitky/development" hreflang="cs">development</a></div> <div class="field__item"><a href="/stitky/hook" hreflang="cs">hook</a></div> <div class="field__item"><a href="/stitky/query" hreflang="cs">query</a></div> <div class="field__item"><a href="/stitky/pro-vyvojare" hreflang="cs">pro vývojáře</a></div> </div> <section class="field field--name-field-comments-article field--type-comment field--label-above comment-wrapper"> <h2 class="title">Komentáře</h2> <article data-comment-user-id="0" id="comment-66" class="comment js-comment by-anonymous"> <mark class="hidden" data-comment-timestamp="1521834342"></mark> <footer class="comment__meta"> <article class="profile"> <div class="field field--name-field-dcz-user-image field--type-image field--label-hidden field__item"> <img loading="lazy" src="/sites/default/files/styles/thumbnail/public/default_images/user-placeholder_0.png?itok=nOY2lA1j" width="100" height="100" alt="Drupal user" class="image-style-thumbnail" /> </div> </article> <p class="comment__submitted">Napsal uživatel <span>Miloš (neověřeno)</span> dne Pá, 03/23/2018 - 20:45</p> <span class="permalink"><a href="/comment/66#comment-66" hreflang="cs">Trvalý odkaz</a></span> </footer> <div class="content"> <h3><a href="/comment/66#comment-66" class="permalink" rel="bookmark" hreflang="cs">Workaround?</a></h3> <div class="clearfix text-formatted field field--name-comment-body field--type-text-long field--label-hidden field__item"><p>Děkuju za popis problému. Mohl bys prosím ještě doplnit, jak jsi to vyřešil?</p></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=66&amp;1=default&amp;2=cs&amp;3=" token="ODUVDKWL7SUwtocYzlWzmfQgthBFKGquLIErMmn79g8"></drupal-render-placeholder> </div> </article> <h2 class="title comment-form__title">Přidat komentář</h2> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=416&amp;2=field_comments_article&amp;3=comment_article" token="Epo3O6ala3cLVf74vIwwiLhsrbnQyugA2Pv8eIFlbWA"></drupal-render-placeholder> </section> Tue, 20 Mar 2018 16:48:01 +0000 martin_klima 416 at https://dev.drupal.cz