{"id":231719,"date":"2022-12-27T11:27:00","date_gmt":"2022-12-27T08:27:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231719"},"modified":"2022-12-27T12:00:10","modified_gmt":"2022-12-27T09:00:10","slug":"tietokantakyselyt-tietojen-nopeaan-paeivittaemiseen-osa-2","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fi\/tietokantakyselyt-tietojen-nopeaan-paeivittaemiseen-osa-2\/","title":{"rendered":"Tietokantakyselyt tietojen nopeaan p\u00e4ivitt\u00e4miseen, osa 2"},"content":{"rendered":"\n<p>T\u00e4m\u00e4 on toinen ja viimeinen osa sarjasta, joka k\u00e4sittelee suoria tietokantakyselyit\u00e4, kuten otsikko kertoo. Tarkemmin sanottuna kyse on viestien tilan muuttamisesta (mutta sill\u00e4 on merkityst\u00e4 muuhunkin).<\/p>\n<p>Kuva Ross Findon Unsplashista<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/fi\/tietokantakyselyt-tietojen-nopeaan-paeivittaemiseen-osa-1\/\" title=\"Edellisest\u00e4 postauksesta:\">Edellisest\u00e4 postauksesta:<\/a><\/p>\n<blockquote>\n<p>T\u00e4m\u00e4 on j\u00e4lleen yksi viesti, joka havainnollistaa kuinka k\u00e4ytt\u00e4\u00e4 $wpdb:t\u00e4 tietojen nopeaan p\u00e4ivitt\u00e4miseen metatietoihin perustuen.<\/p>\n<\/blockquote>\n<p>Ja tuossa viestiss\u00e4 annettu koodi toimii, mutta jos haluat tehd\u00e4 siit\u00e4 oliokeskeisemm\u00e4n, ty\u00f6t\u00e4 voidaan tehd\u00e4 enemm\u00e4n.<\/p>\n<p>Ennen kuin siirryt varsinaiseen viestiin, on kuitenkin t\u00e4rke\u00e4\u00e4 huomata, ett\u00e4 olio-ohjelmoinnin osalta luokan suunnitteluun ja abstraktiotasojen luomiseen voi menn\u00e4 paljon ty\u00f6t\u00e4.<\/p>\n<p>Jossain vaiheessa sinun on vedett\u00e4v\u00e4 sananmukainen raja sen v\u00e4lille, milloin aiot k\u00e4ytt\u00e4\u00e4 rajapintoja, kuinka tarkkoja luokkasi tulevat olemaan sen suhteen, mit\u00e4 ne abstraktoivat, ja vastaavat.<\/p>\n<p>Ja t\u00e4m\u00e4n postauksen tarkoituksena on auttaa tarjoamaan parempi oliopohjainen suunnittelu, mutta se ei ole harjoitus, joka tekee siit\u00e4 mahdollisimman optimaalisen. Keskustelen t\u00e4llaisista aiheista <a href=\"https:\/\/tommcfarlin.com\/tag\/object-oriented-programming-in-wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">toisessa viestisarjassa<\/a>.<\/p>\n<p>Mutta pid\u00e4 t\u00e4m\u00e4 mieless\u00e4, kun luet koodia l\u00e4pi koko viestin.<\/p>\n<h2>Tietokantakyselyt tietojen nopeaan p\u00e4ivitt\u00e4miseen, osa 2<\/h2>\n<p>Kun otetaan huomioon, mihin j\u00e4imme, meill\u00e4 on yksi toiminto, joka suorittaa seuraavat asiat:<\/p>\n<ol>\n<li>hakea kaikki viestit, jotka liittyv\u00e4t tiettyyn metaavaimeen,<\/li>\n<li>p\u00e4\u00e4tt\u00e4\u00e4, onko meid\u00e4n poistuttava aikaisin,<\/li>\n<li>p\u00e4ivitt\u00e4\u00e4 olemassa olevien viestien tilan.<\/li>\n<\/ol>\n<p>Ensimm\u00e4inen huomioitava asia on, ett\u00e4 yksi toiminto on liikaa, joten se on jaettava useisiin muihin toimintoihin. Ja koska se on oliokeskeinen, meid\u00e4n on varmistettava, ett\u00e4 mit\u00e4 tahansa toiminto tekee, ei v\u00e4ltt\u00e4m\u00e4tt\u00e4 edellytet\u00e4 aiempia vaiheita \u2013 juuri siit\u00e4 on kyse prosessiohjelmoinnista.<\/p>\n<p>Sen sijaan k\u00e4yt\u00e4mme t\u00e4t\u00e4 tilaisuutta toimintojen m\u00e4\u00e4ritt\u00e4miseen, jotta ne k\u00e4ytt\u00e4v\u00e4t mit\u00e4 tahansa niille v\u00e4litetty\u00e4 dataa riippumatta siit\u00e4, miten he p\u00e4\u00e4siv\u00e4t sinne.<\/p>\n<p>Lopuksi sinun on kehitt\u00e4j\u00e4n\u00e4 p\u00e4\u00e4tett\u00e4v\u00e4, haluatko k\u00e4ytt\u00e4\u00e4 t\u00e4t\u00e4 varten yht\u00e4 luokkaa, useampaa kuin yht\u00e4 luokkaa vai joukon toisiinsa liittyvi\u00e4 luokkia, jotka periv\u00e4t p\u00e4\u00e4luokalta.<\/p>\n<p>J\u00e4lleen kyse on siit\u00e4, kuinka abstraktin haluat tehd\u00e4 koodista.<\/p>\n<p>Toistaiseksi menn\u00e4\u00e4n kuitenkin asioiden purkamisessa.<\/p>\n<h3>1 Tartu viestitunnukseen liittyv\u00e4ll\u00e4 metaavaimella<\/h3>\n<p>Aivan kuten ensimm\u00e4isess\u00e4 viestiss\u00e4, haluamme varmistaa, ett\u00e4 haemme viestitunnuksia, jotka liittyv\u00e4t tiettyyn metaavaimeen.<\/p>\n<p>Jotta t\u00e4st\u00e4 toiminnosta olisi mahdollisimman joustava, asetamme sen seuraavasti:<\/p>\n<ul>\n<li>hyv\u00e4ksy meta-avain merkkijonoksi,<\/li>\n<li>palauttaa taulukon<\/li>\n<\/ul>\n<p>Funktio n\u00e4ytt\u00e4\u00e4 sitten suunnilleen <a href=\"https:\/\/gist.github.com\/tommcfarlin\/233a98350aa5ad4765e2a3c84691b0c1#file-00-get-inactive-post-ids-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">t\u00e4lt\u00e4:<\/a><\/p>\n<pre><code>&lt;?php\n\n\/**\n * Locates all of the post IDs that are associated with an empty meta key (which\n * is specified as an argument for the function).\n *\n * @param string $metaKey The meta key used to retrieve the set of post IDs.\n * @return array $results The set of product IDs associated with the specified meta key.\n *\/\npublic function getInactivePostIds(string $metaKey): array\n{\n    global $wpdb;\n\n    $results = $wpdb-&gt;get_results(\n        $wpdb-&gt;prepare(\n            \"\n            SELECT post_id\n            FROM $wpdb-&gt;postmeta\n            WHERE meta_key = %s\n            AND meta_value = ''\n            \",\n            $metaKey) );\n\n    return $results;\n}<\/code><\/pre>\n<p>Ensimm\u00e4isess\u00e4 viestiss\u00e4 jaoimme t\u00e4m\u00e4n kolmeen vaiheeseen (jotka on my\u00f6s kuvattu edell\u00e4). T\u00e4ss\u00e4 voimme kuitenkin yhdist\u00e4\u00e4 toisen ja kolmannen vaiheen yhdeksi funktioksi.<\/p>\n<h3>2 P\u00e4ivit\u00e4 viestin tila<\/h3>\n<p>Kuten mainitsin, olio-ohjelmoinnin yksi n\u00e4k\u00f6kohta on varmistaa, ett\u00e4 k\u00e4ytt\u00e4m\u00e4mme toiminnot ovat agnostisia sen suhteen, kuinka ne vastaanottavat tiedot luotiin.<\/p>\n<p>Sen sijaan niill\u00e4 on suoritettava yksi algoritmi keskitty\u00e4kseen funktioon siirrettyihin tietoihin. T\u00e4ss\u00e4 tapauksessa haluamme ottaa tulosjoukon \u2013 jotka ovat viestitunnuksia \u2013 ja p\u00e4ivitt\u00e4\u00e4 niiden viestien tilan niin, ett\u00e4 se on <strong>luonnos<\/strong>.<\/p>\n<p>T\u00e4m\u00e4 tarkoittaa, ett\u00e4 funktio hyv\u00e4ksyy taulukon, mutta ei palauta mit\u00e4\u00e4n. Mahdollisesti voisit antaa sen seurata monia p\u00e4ivitettyj\u00e4 viestej\u00e4 (tai p\u00e4ivitt\u00e4\u00e4k\u00f6 se mit\u00e4\u00e4n), mutta keskityn vain muokkaamaan jo olemassa olevaa koodia uudelleen.<\/p>\n<p>Joten sit\u00e4 aiomme tehd\u00e4. Ja ensimm\u00e4inen asia on varmistaa, ett\u00e4 k\u00e4ytett\u00e4viss\u00e4 on todellista dataa, jonka kanssa voit ty\u00f6skennell\u00e4. Ja jos on, toista viestitunnusten luettelo ja <a href=\"https:\/\/gist.github.com\/tommcfarlin\/233a98350aa5ad4765e2a3c84691b0c1#file-01-set-posts-to-draft-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">muuta niiden viestien tilaa:<\/a><\/p>\n<pre><code>&lt;?php\n\n\/**\n * Updates incoming posts by setting their post status to 'draft.'\n *\n * @param array $postData the set of post IDs associated with the specific meta key.\n *\/\npublic function setPostsToDraft(array $postData)\n{\n    \/\/ If the post data is empty, there's nothing to do.\n    if (0 === count($postData)) {\n        return;\n    }\n\n    \/\/ Otherwise, set the post_status of the specified post IDs to 'draft'.\n    global $wpdb;\n    foreach ($postData as $post) {\n        $wpdb-&gt;get_results(\n            $wpdb-&gt;prepare(\n                \"\n                UPDATE $wpdb-&gt;posts\n                SET post_status = %s\n                WHERE ID = %d\n                \",\n                'draft',\n                (int) ($post-&gt;post_id)) );\n    }\n}<\/code><\/pre>\n<p>Voit n\u00e4hd\u00e4, ett\u00e4 se ei juurikaan eroa ensimm\u00e4isess\u00e4 viestiss\u00e4 tehdyst\u00e4 ty\u00f6st\u00e4, mutta nyt se her\u00e4tt\u00e4\u00e4 muutaman kysymyksen.<\/p>\n<h3>3 Oliol\u00e4ht\u00f6isi\u00e4 huomioita<\/h3>\n<p>Kun ty\u00f6skentelet seuraavanlaisen koodin kanssa:<\/p>\n<ul>\n<li>Kuuluuko se kaikki samaan luokkaan vai eri luokkiin?<\/li>\n<li>Pit\u00e4isik\u00f6 perusluokka olla ja jos on, miksi tai miksi ei?<\/li>\n<li>Pit\u00e4isik\u00f6 olla yksi julkinen toiminto, joka kutsuu n\u00e4it\u00e4 menetelmi\u00e4 (ja merkit\u00e4 ne yksityisiksi)?<\/li>\n<li>Pit\u00e4isik\u00f6 meid\u00e4n j\u00e4tt\u00e4\u00e4 toiminnot julkisiksi?<\/li>\n<\/ul>\n<p>T\u00e4t\u00e4 postausta varten aion tehd\u00e4 seuraavaa:<\/p>\n<ul>\n<li><strong>N\u00e4yt\u00e4 jokainen funktio julkisena menetelm\u00e4n\u00e4<\/strong>. T\u00e4m\u00e4 johtuu siit\u00e4, ett\u00e4 jos ensimm\u00e4isest\u00e4 menetelm\u00e4st\u00e4 palautetaan tietoja, voit mahdollisesti tehd\u00e4 sill\u00e4 jotain muuta.<\/li>\n<li><strong>Pid\u00e4 se yhden luokan sis\u00e4ll\u00e4<\/strong>. T\u00e4ll\u00e4 tavalla voimme instantoida yksitt\u00e4isen luokan ja k\u00e4ytt\u00e4\u00e4 sit\u00e4 mink\u00e4 tahansa ty\u00f6n tekemiseen. Jos olisi muita menetelmi\u00e4, k\u00e4ytt\u00e4isimme samoja menetelmi\u00e4.<\/li>\n<li><strong>Aloita k\u00e4ytt\u00f6liittym\u00e4st\u00e4<\/strong>. En aio vaivautua kirjoittamaan k\u00e4ytt\u00f6liittym\u00e4\u00e4 vain n\u00e4ytt\u00e4\u00e4kseni k\u00e4ytt\u00f6liittym\u00e4n (oletan, ett\u00e4 se on tarpeeksi helppo p\u00e4\u00e4tell\u00e4 nykyisten funktioiden perusteella), mutta aion k\u00e4yd\u00e4 kurssilla ja n\u00e4ytt\u00e4\u00e4, kuinka voimme kutsua toimii &quot;ulkopuolelta sis\u00e4\u00e4n&quot;.<\/li>\n<\/ul>\n<p>Joten aloitan <a href=\"https:\/\/gist.github.com\/tommcfarlin\/233a98350aa5ad4765e2a3c84691b0c1#file-02-invoking-the-class-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">viimeisest\u00e4 kohdasta<\/a> ja ty\u00f6skentelen taaksep\u00e4in. T\u00e4ss\u00e4 on yksi tapa k\u00e4ytt\u00e4\u00e4 koodia:<\/p>\n<pre><code>&lt;?php\n\n$postStatusModifier = new PostStatusModifier();\n$inactivePost = $postStatusModifier-&gt;getInactivePostIds('acme-status');\n$postStatusModifier-&gt;setPostsToDraft($inactivePosts);<\/code><\/pre>\n<p>Ja sitten t\u00e4lt\u00e4 <a href=\"https:\/\/gist.github.com\/tommcfarlin\/233a98350aa5ad4765e2a3c84691b0c1#file-03-post-status-modifier-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">koko luokka<\/a> n\u00e4ytt\u00e4\u00e4:<\/p>\n<pre><code>&lt;?php\n\nclass PostStatusModifier\n{\n    \/**\n     * Locates all of the post IDs that are associated with an empty meta key (which\n     * is specified as an argument for the function).\n     *\n     * @param string $metaKey The meta key used to retrieve the set of post IDs.\n     * @return array $results The set of product IDs associated with the specified meta key.\n     *\/\n    public function getInactivePostIds(string $metaKey): array\n    {\n        global $wpdb;\n\n        $results = $wpdb-&gt;get_results(\n            $wpdb-&gt;prepare(\n                \"\n                SELECT post_id\n                FROM $wpdb-&gt;postmeta\n                WHERE meta_key = %s\n                AND meta_value = ''\n                \",\n                $metaKey) );\n\n        return $results;\n    }\n\n    \/**\n     * Updates incoming posts by setting their post status to 'draft.'\n     *\n     * @param array $postData the set of post IDs associated with the specific meta key.\n     *\/\n    public function setPostsToDraft(array $postData)\n    {\n        \/\/ If the post data is empty, there's nothing to do.\n        if (0 === count($postData)) {\n            return;\n        }\n\n        \/\/ Otherwise, set the post_status of the specified post IDs to 'draft'.\n        global $wpdb;\n        foreach ($postData as $post) {\n            $wpdb-&gt;get_results(\n                $wpdb-&gt;prepare(\n                    \"\n                    UPDATE $wpdb-&gt;posts\n                    SET post_status = %s\n                    WHERE ID = %d\n                    \",\n                    'draft',\n                    (int) ($post-&gt;post_id)) );\n        }\n    }\n}<\/code><\/pre>\n<p>Yleisesti ottaen se palvelee samoja tarkoituksia kuin ensimm\u00e4inen, mutta oliokeskeisemm\u00e4ll\u00e4 tavalla.<\/p>\n<h2>Se ei ole tapa<\/h2>\n<p>Kuten olen yritt\u00e4nyt toistaa useita kertoja t\u00e4m\u00e4n viestin kautta, t\u00e4m\u00e4 ei ole lopullinen tapa tehd\u00e4 t\u00e4t\u00e4 ty\u00f6t\u00e4. Sen sijaan se on yksi tapa tehd\u00e4 ty\u00f6t\u00e4.<\/p>\n<p>Voit suunnitella, muuttaa tai k\u00e4ytt\u00e4\u00e4 t\u00e4t\u00e4 uudelleen haluamallasi tavalla. Tarkoituksena on kuitenkin n\u00e4ytt\u00e4\u00e4, kuinka irrottaa logiikka, jonka yleens\u00e4 n\u00e4emme proseduurina, johonkin, joka on hieman v\u00e4hemm\u00e4n riippuvainen itsest\u00e4\u00e4n ja j\u00e4tt\u00e4\u00e4 tilaa lis\u00e4ty\u00f6lle.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Oliopohjaisten periaatteiden k\u00e4ytt\u00e4minen luokan suunnittelun parantamiseksi tietokantakyselyjen kirjoittamisessa tietojen nopeaan p\u00e4ivitt\u00e4miseen.<\/p>\n","protected":false},"author":1,"featured_media":237043,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[719,895,917,834,843],"tags":[1166],"class_list":["post-231719","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kehittaejae","category-koodi","category-muut","category-opas-aloittelijoille","category-opetusohjelmia","tag-affiai-fi"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/231719","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/comments?post=231719"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/231719\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media\/237043"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media?parent=231719"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/categories?post=231719"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/tags?post=231719"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}