Home Backend Development PHP Tutorial Build your own PHP framework--implement Model class 3

Build your own PHP framework--implement Model class 3

Jul 29, 2016 am 09:01 AM
model static

In the previous blog, we implemented and improved the findOne method of the Model class. Let’s implement the other methods below.

Let’s first look at the findAll method. This method is very similar to findOne.

<code><span>public</span><span>static</span><span>function</span> findOne<span>(</span><span>$condition</span> = <span>null</span><span>)</span>
    {
        <span>$sql</span> = <span>'select * from '</span> . <span>static</span>::tableName<span>();</span><span>$params</span> = <span>[];</span><span>// 判空</span><span>if</span><span>(</span>!<span>empty</span><span>(</span><span>$condition</span><span>))</span> {
            <span>$sql</span> .= <span>' where '</span><span>;</span><span>$params</span> = <span>array_values</span><span>(</span><span>$condition</span><span>);</span><span>$keys</span> = <span>[];</span><span>foreach</span><span>(</span><span>$condition</span><span>as</span><span>$key</span> => <span>$value</span><span>)</span> {
                <span>array_push</span><span>(</span><span>$keys</span><span>,</span><span>"</span><span>$key</span><span> = ?"</span><span>);</span>
            }
            <span>$sql</span> .= <span>implode</span><span>(</span><span>' and '</span><span>,</span><span>$keys</span><span>);</span>
        }

        <span>$stmt</span> = <span>static</span>::getDb<span>()</span>->prepare<span>(</span><span>$sql</span><span>);</span><span>$rs</span> = <span>$stmt</span>->execute<span>(</span><span>$params</span><span>);</span><span>$models</span> = <span>[];</span><span>if</span><span>(</span><span>$rs</span><span>)</span> {
            <span>// 直接获取出所有符合条件的</span><span>$rows</span> = <span>$stmt</span>->fetchAll<span>(</span><span>PDO</span>::<span>FETCH_ASSOC</span><span>);</span><span>foreach</span><span>(</span><span>$rows</span><span>as</span><span>$row</span><span>)</span> {
                <span>if</span><span>(</span>!<span>empty</span><span>(</span><span>$row</span><span>))</span> {
                    <span>$model</span> = <span>new</span><span>static</span><span>();</span><span>foreach</span><span>(</span><span>$row</span><span>as</span><span>$rowKey</span> => <span>$rowValue</span><span>)</span> {
                        <span>$model</span>-><span>$rowKey</span> = <span>$rowValue</span><span>;</span>
                    }
                    <span>array_push</span><span>(</span><span>$models</span><span>,</span><span>$model</span><span>);</span>
                }
            }
        }

        <span>return</span><span>null</span><span>;</span>
    }</code>
Copy after login

You will find that the findOne and findAll methods are very similar. It is obvious that the common part can be extracted, and then we have the following two methods:

<code><span>/**</span><span>     * Build a sql where part</span><span>     * </span><span>@param</span><span>mixed</span><span> $condition a set of column values</span><span>     * </span><span>@return</span><span> string</span><span>     */</span><span>public</span><span>static</span><span>function</span> buildWhere<span>(</span><span>$condition</span><span>,</span><span>$params</span> = <span>null</span><span>)</span>
    {
        <span>if</span><span>(</span><span>is_null</span><span>(</span><span>$params</span><span>))</span> {
            <span>$params</span> = <span>[];</span>
        }

        <span>$where</span> = <span>''</span><span>;</span><span>if</span><span>(</span>!<span>empty</span><span>(</span><span>$condition</span><span>))</span> {
            <span>$where</span> .= <span>' where '</span><span>;</span><span>$keys</span> = <span>[];</span><span>foreach</span><span>(</span><span>$condition</span><span>as</span><span>$key</span> => <span>$value</span><span>)</span> {
                <span>array_push</span><span>(</span><span>$keys</span><span>,</span><span>"</span><span>$key</span><span> = ?"</span><span>);</span><span>array_push</span><span>(</span><span>$params</span><span>,</span><span>$value</span><span>);</span>
            }
            <span>$where</span> .= <span>implode</span><span>(</span><span>' and '</span><span>,</span><span>$keys</span><span>);</span>
        }
        <span>return</span><span>[</span><span>$where</span><span>,</span><span>$params</span><span>];</span>
    }

    <span>/**</span><span>     * Convert array to model</span><span>     * </span><span>@param</span><span>mixed</span><span> $row the row data from database</span><span>     */</span><span>public</span><span>static</span><span>function</span> arr2Model<span>(</span><span>$row</span><span>)</span>
    {
        <span>$model</span> = <span>new</span><span>static</span><span>();</span><span>foreach</span><span>(</span><span>$row</span><span>as</span><span>$rowKey</span> => <span>$rowValue</span><span>)</span> {
            <span>$model</span>-><span>$rowKey</span> = <span>$rowValue</span><span>;</span>
        }
        <span>return</span><span>$model</span><span>;</span>
    }</code>
Copy after login

are the method of constructing the where part of sql and Method to convert the found Array into a Model. You may wonder why the params parameter and return value are needed in the first method. In fact, this is for the later use of the updateAll method. In fact, this place is suitable for using reference pass-by-value.

In this way, our findOne and findAll will become the following:

<code><span>/**</span><span>     * Returns a single model instance by a primary key or an array of column values.</span><span>     *</span><span>     * ```php</span><span>     * // find the first customer whose age is 30 and whose status is 1</span><span>     * $customer = Customer::findOne(['age' => 30, 'status' => 1]);</span><span>     * ```</span><span>     *</span><span>     * </span><span>@param</span><span>mixed</span><span> $condition a set of column values</span><span>     * </span><span>@return</span><span> static|null Model instance matching the condition, or null if nothing matches.</span><span>     */</span><span>public</span><span>static</span><span>function</span> findOne<span>(</span><span>$condition</span> = <span>null</span><span>)</span>
    {
        <span>list</span><span>(</span><span>$where</span><span>,</span><span>$params</span><span>)</span> = <span>static</span>::buildWhere<span>(</span><span>$condition</span><span>);</span><span>$sql</span> = <span>'select * from '</span> . <span>static</span>::tableName<span>()</span> . <span>$where</span><span>;</span><span>$stmt</span> = <span>static</span>::getDb<span>()</span>->prepare<span>(</span><span>$sql</span><span>);</span><span>$rs</span> = <span>$stmt</span>->execute<span>(</span><span>$params</span><span>);</span><span>if</span><span>(</span><span>$rs</span><span>)</span> {
            <span>$row</span> = <span>$stmt</span>->fetch<span>(</span><span>PDO</span>::<span>FETCH_ASSOC</span><span>);</span><span>if</span><span>(</span>!<span>empty</span><span>(</span><span>$row</span><span>))</span> {
                <span>return</span><span>static</span>::arr2Model<span>(</span><span>$row</span><span>);</span>
            }
        }

        <span>return</span><span>null</span><span>;</span>
    }

    <span>/**</span><span>     * Returns a list of models that match the specified primary key value(s) or a set of column values.</span><span>     *</span><span>     *  ```php</span><span>     * // find customers whose age is 30 and whose status is 1</span><span>     * $customers = Customer::findAll(['age' => 30, 'status' => 1]);</span><span>     * ```</span><span>     *</span><span>     * </span><span>@param</span><span>mixed</span><span> $condition a set of column values</span><span>     * </span><span>@return</span><span> array an array of Model instance, or an empty array if nothing matches.</span><span>     */</span><span>public</span><span>static</span><span>function</span> findAll<span>(</span><span>$condition</span> = <span>null</span><span>)</span>
    {
        <span>list</span><span>(</span><span>$where</span><span>,</span><span>$params</span><span>)</span> = <span>static</span>::buildWhere<span>(</span><span>$condition</span><span>);</span><span>$sql</span> = <span>'select * from '</span> . <span>static</span>::tableName<span>()</span> . <span>$where</span><span>;</span><span>$stmt</span> = <span>static</span>::getDb<span>()</span>->prepare<span>(</span><span>$sql</span><span>);</span><span>$rs</span> = <span>$stmt</span>->execute<span>(</span><span>$params</span><span>);</span><span>$models</span> = <span>[];</span><span>if</span><span>(</span><span>$rs</span><span>)</span> {
            <span>$rows</span> = <span>$stmt</span>->fetchAll<span>(</span><span>PDO</span>::<span>FETCH_ASSOC</span><span>);</span><span>foreach</span><span>(</span><span>$rows</span><span>as</span><span>$row</span><span>)</span> {
                <span>if</span><span>(</span>!<span>empty</span><span>(</span><span>$row</span><span>))</span> {
                    <span>$model</span> = <span>static</span>::arr2Model<span>(</span><span>$row</span><span>);</span><span>array_push</span><span>(</span><span>$models</span><span>,</span><span>$model</span><span>);</span>
                }
            }
        }

        <span>return</span><span>$models</span><span>;</span>
    }</code>
Copy after login

The remaining updateAll/deleteAll/insert/update and delete methods will not be explained in detail one by one, and the codes will be given directly. The basic ideas are the same, and they all splice SQL statements according to rules.

<code><span>/**</span><span>     * Updates models using the provided attribute values and conditions.</span><span>     * For example, to change the status to be 2 for all customers whose status is 1:</span><span>     *</span><span>     * ~~~</span><span>     * Customer::updateAll(['status' => 1], ['status' => '2']);</span><span>     * ~~~</span><span>     *</span><span>     * </span><span>@param</span><span>array</span><span> $attributes attribute values (name-value pairs) to be saved for the model.</span><span>     * </span><span>@param</span><span>array</span><span> $condition the condition that matches the models that should get updated.</span><span>     * An empty condition will match all models.</span><span>     * </span><span>@return</span><span> integer the number of rows updated</span><span>     */</span><span>public</span><span>static</span><span>function</span> updateAll<span>(</span><span>$condition</span><span>,</span><span>$attributes</span><span>)</span>
    {
        <span>$sql</span> = <span>'update '</span> . <span>static</span>::tableName<span>();</span><span>$params</span> = <span>[];</span><span>if</span><span>(</span>!<span>empty</span><span>(</span><span>$attributes</span><span>))</span> {
            <span>$sql</span> .= <span>' set '</span><span>;</span><span>$params</span> = <span>array_values</span><span>(</span><span>$attributes</span><span>);</span><span>$keys</span> = <span>[];</span><span>foreach</span><span>(</span><span>$attributes</span><span>as</span><span>$key</span> => <span>$value</span><span>)</span> {
                <span>array_push</span><span>(</span><span>$keys</span><span>,</span><span>"</span><span>$key</span><span> = ?"</span><span>);</span>
            }
            <span>$sql</span> .= <span>implode</span><span>(</span><span>' , '</span><span>,</span><span>$keys</span><span>);</span>
        }

        <span>list</span><span>(</span><span>$where</span><span>,</span><span>$params</span><span>)</span> = <span>static</span>::buildWhere<span>(</span><span>$condition</span><span>,</span><span>$params</span><span>);</span><span>$sql</span> .= <span>$where</span><span>;</span><span>$stmt</span> = <span>static</span>::getDb<span>()</span>->prepare<span>(</span><span>$sql</span><span>);</span><span>$execResult</span> = <span>$stmt</span>->execute<span>(</span><span>$params</span><span>);</span><span>if</span><span>(</span><span>$execResult</span><span>)</span> {
            <span>// 获取更新的行数</span><span>$execResult</span> = <span>$stmt</span>->rowCount<span>();</span>
        }
        <span>return</span><span>$execResult</span><span>;</span>
    }

    <span>/**</span><span>     * Deletes models using the provided conditions.</span><span>     * WARNING: If you do not specify any condition, this method will delete ALL rows in the table.</span><span>     *</span><span>     * For example, to delete all customers whose status is 3:</span><span>     *</span><span>     * ~~~</span><span>     * Customer::deleteAll([status = 3]);</span><span>     * ~~~</span><span>     *</span><span>     * </span><span>@param</span><span>array</span><span> $condition the condition that matches the models that should get deleted.</span><span>     * An empty condition will match all models.</span><span>     * </span><span>@return</span><span> integer the number of rows deleted</span><span>     */</span><span>public</span><span>static</span><span>function</span> deleteAll<span>(</span><span>$condition</span><span>)</span>
    {
        <span>list</span><span>(</span><span>$where</span><span>,</span><span>$params</span><span>)</span> = <span>static</span>::buildWhere<span>(</span><span>$condition</span><span>);</span><span>$sql</span> = <span>'delete from '</span> . <span>static</span>::tableName<span>()</span> . <span>$where</span><span>;</span><span>$stmt</span> = <span>static</span>::getDb<span>()</span>->prepare<span>(</span><span>$sql</span><span>);</span><span>$execResult</span> = <span>$stmt</span>->execute<span>(</span><span>$params</span><span>);</span><span>if</span><span>(</span><span>$execResult</span><span>)</span> {
            <span>// 获取删除的行数</span><span>$execResult</span> = <span>$stmt</span>->rowCount<span>();</span>
        }
        <span>return</span><span>$execResult</span><span>;</span>
    }

    <span>/**</span><span>     * Inserts the model into the database using the attribute values of this record.</span><span>     *</span><span>     * Usage example:</span><span>     *</span><span>     * ```php</span><span>     * $customer = new Customer;</span><span>     * $customer->name = $name;</span><span>     * $customer->email = $email;</span><span>     * $customer->insert();</span><span>     * ```</span><span>     *</span><span>     * </span><span>@return</span><span> boolean whether the model is inserted successfully.</span><span>     */</span><span>public</span><span>function</span> insert<span>()</span>
    {
        <span>$sql</span> = <span>'insert into '</span> . <span>static</span>::tableName<span>();</span><span>$params</span> = <span>[];</span><span>$keys</span> = <span>[];</span><span>foreach</span><span>(</span><span>$this</span><span>as</span><span>$key</span> => <span>$value</span><span>)</span> {
            <span>array_push</span><span>(</span><span>$keys</span><span>,</span><span>$key</span><span>);</span><span>array_push</span><span>(</span><span>$params</span><span>,</span><span>$value</span><span>);</span>
        }
        <span>// 构建由?组成的数组,其个数与参数相等数相同</span><span>$holders</span> = <span>array_fill</span><span>(</span><span>0</span><span>,</span><span>count</span><span>(</span><span>$keys</span><span>),</span><span>'?'</span><span>);</span><span>$sql</span> .= <span>' ('</span> . <span>implode</span><span>(</span><span>' , '</span><span>,</span><span>$keys</span><span>)</span> . <span>') values ( '</span> . <span>implode</span><span>(</span><span>' , '</span><span>,</span><span>$holders</span><span>)</span> . <span>')'</span><span>;</span><span>$stmt</span> = <span>static</span>::getDb<span>()</span>->prepare<span>(</span><span>$sql</span><span>);</span><span>$execResult</span> = <span>$stmt</span>->execute<span>(</span><span>$params</span><span>);</span><span>// 将一些自增值赋回Model中</span><span>$primaryKeys</span> = <span>static</span>::primaryKey<span>();</span><span>foreach</span><span>(</span><span>$primaryKeys</span><span>as</span><span>$name</span><span>)</span> {
            <span>// Get the primary key</span><span>$lastId</span> = <span>static</span>::getDb<span>()</span>->lastInsertId<span>(</span><span>$name</span><span>);</span><span>$this</span>-><span>$name</span> = <span>(int)</span><span>$lastId</span><span>;</span>
        }
        <span>return</span><span>$execResult</span><span>;</span>
    }

    <span>/**</span><span>     * Saves the changes to this model into the database.</span><span>     *</span><span>     * Usage example:</span><span>     *</span><span>     * ```php</span><span>     * $customer = Customer::findOne(['id' => $id]);</span><span>     * $customer->name = $name;</span><span>     * $customer->email = $email;</span><span>     * $customer->update();</span><span>     * ```</span><span>     *</span><span>     * </span><span>@return</span><span> integer|boolean the number of rows affected.</span><span>     * Note that it is possible that the number of rows affected is 0, even though the</span><span>     * update execution is successful.</span><span>     */</span><span>public</span><span>function</span> update<span>()</span>
    {
        <span>$primaryKeys</span> = <span>static</span>::primaryKey<span>();</span><span>$condition</span> = <span>[];</span><span>foreach</span><span>(</span><span>$primaryKeys</span><span>as</span><span>$name</span><span>)</span> {
            <span>$condition</span><span>[</span><span>$name</span><span>]</span> = <span>isset</span><span>(</span><span>$this</span>-><span>$name</span><span>)</span><span>?</span><span>$this</span>-><span>$name</span><span>:</span><span>null</span><span>;</span>
        }

        <span>$attributes</span> = <span>[];</span><span>foreach</span><span>(</span><span>$this</span><span>as</span><span>$key</span> => <span>$value</span><span>)</span> {
            <span>if</span><span>(</span>!<span>in_array</span><span>(</span><span>$key</span><span>,</span><span>$primaryKeys</span><span>,</span><span>true</span><span>))</span> {
                <span>$attributes</span><span>[</span><span>$key</span><span>]</span> = <span>$value</span><span>;</span>
            }
        }

        <span>return</span><span>static</span>::updateAll<span>(</span><span>$condition</span><span>,</span><span>$attributes</span><span>)</span> !== <span>false</span><span>;</span>
    }

    <span>/**</span><span>     * Deletes the model from the database.</span><span>     *</span><span>     * </span><span>@return</span><span> integer|boolean the number of rows deleted.</span><span>     * Note that it is possible that the number of rows deleted is 0, even though the deletion execution is successful.</span><span>     */</span><span>public</span><span>function</span> delete<span>()</span>
    {
        <span>$primaryKeys</span> = <span>static</span>::primaryKey<span>();</span><span>$condition</span> = <span>[];</span><span>foreach</span><span>(</span><span>$primaryKeys</span><span>as</span><span>$name</span><span>)</span> {
            <span>$condition</span><span>[</span><span>$name</span><span>]</span> = <span>isset</span><span>(</span><span>$this</span>-><span>$name</span><span>)</span><span>?</span><span>$this</span>-><span>$name</span><span>:</span><span>null</span><span>;</span>
        }

        <span>return</span><span>static</span>::deleteAll<span>(</span><span>$condition</span><span>)</span> !== <span>false</span><span>;</span>
    }</code>
Copy after login

This basic Model is temporarily completed. Although there may still be many problems and limitations, this is it for now. We will improve it step by step when we have the opportunity.

Okay, let’s stop here today. Project content and blog content will also be put on Github, and everyone is welcome to make suggestions.

code: https://github.com/CraryPrimitiveMan/simple-framework/tree/0.7

blog project: https://github.com/CraryPrimitiveMan/create-your-own-php-framework

The above introduces the construction of your own PHP framework-implementing Model class 3, including aspects of the content. I hope it will be helpful to friends who are interested in PHP tutorials.

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
2 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
Repo: How To Revive Teammates
4 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: How To Get Giant Seeds
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Trezor Cold Wallet: Model One and Model T Features and Usage Guide Trezor Cold Wallet: Model One and Model T Features and Usage Guide Jan 19, 2024 pm 04:12 PM

After problems occurred in many centralized exchanges, more and more cryptocurrency investors began to transfer assets to cold wallets to reduce the risks posed by centralized exchanges. This article will introduce Trezor, the world's earliest cold wallet provider. Since the first cold wallet was launched in 2014, it has been sold in many countries around the world. Trezor's products include Model One launched in 2014 and the advanced version Model T launched in 2018. The following will continue to introduce the differences between these two products and other cold wallets. What is Trezor cold wallet? In 2014, Trezor launched the first cold wallet ModelOne. In addition to common BTC, ETH, USDT and other currencies, the wallet also supports more than 1,000 other currencies.

What is the function and usage of static in C language What is the function and usage of static in C language Jan 31, 2024 pm 01:59 PM

The role and usage of static in C language: 1. Variable scope; 2. Life cycle; 3. Internal function; 4. Modify global variables; 5. Modify function; 6. Other uses; Detailed introduction: 1. Variable scope, when If there is the static keyword before a variable, then the scope of the variable is limited to the file in which it is declared. In other words, the variable is a "file-level scope", which is very useful for preventing the "duplicate definition" problem of variables; 2. Life cycle, static variables are initialized once when the program starts executing, and destroyed when the program ends, etc.

How to use static, this, super, and final in Java How to use static, this, super, and final in Java Apr 18, 2023 pm 03:40 PM

1. static Please look at the following program first: publicclassHello{publicstaticvoidmain(String[]args){//(1)System.out.println("Hello, world!");//(2)}} Have seen this Segment programs are familiar to most people who have studied Java. Even if you have not learned Java but have learned other high-level languages, such as C, you should be able to understand the meaning of this code. It simply outputs "Hello, world" and has no other use. However, it shows the main purpose of the static keyword.

Detailed explanation of Model in Django framework Detailed explanation of Model in Django framework Jun 17, 2023 am 08:48 AM

Django is an open source Python web framework. It adopts the MVT (Model-View-Template) architectural pattern and divides the application into three parts: Model, View and Template. Among them, Model is a basic component in the Django framework, used to define and manage data. This article will provide a detailed explanation of Model in the Django framework. What is Model in Django

The role of static The role of static Jan 24, 2024 pm 04:08 PM

The functions of static: 1. Variables; 2. Methods; 3. Classes; 4. Other uses; 5. Multi-threaded environment; 6. Performance optimization; 7. Singleton mode; 8. Constants; 9. Local variables; 10. Memory Layout optimization; 11. Avoid repeated initialization; 12. Use in functions. Detailed introduction: 1. Variables, static variables. When a variable is declared as static, it belongs to the class level, not the instance level, which means that no matter how many objects are created, only one static variable exists, and all objects share this Static variables and so on.

Practical application scenarios and usage skills of the static keyword in C language Practical application scenarios and usage skills of the static keyword in C language Feb 21, 2024 pm 07:21 PM

Practical application scenarios and usage skills of the static keyword in C language 1. Overview static is a keyword in C language, used to modify variables and functions. Its function is to change its life cycle and visibility during program running, making variables and functions static. This article will introduce the actual application scenarios and usage techniques of the static keyword, and illustrate it through specific code examples. 2. Static variables extend the life cycle of variables. Using the static keyword to modify local variables can extend their life cycle.

What is the static method of php What is the static method of php Oct 31, 2022 am 09:40 AM

The "static" in php static static methods means that these properties and methods can be called directly without instantiating the class; static is a keyword used to modify the properties and methods of the class, and its usage syntax is such as "class Foo {public static $my_static = 'hello';}".

How to use Java modifiers abstract, static and final How to use Java modifiers abstract, static and final Apr 26, 2023 am 09:46 AM

Modifier abstract (abstract) 1. Abstract can modify a class (1) The class modified by abstract is called an abstract class (2) Syntax: abstractclass class name {} (3) Features: Abstract classes cannot create objects separately, but they can be declared Reference the abstract class name reference name; (4) Abstract classes can define member variables and member methods (5) Abstract classes have constructors. When used to create subclass objects, jvm creates a parent class object by default; abstract constructor methods apply Applied when jvm creates parent class object. 2. Abstract can modify methods (1) The method modified by asbtract is called an abstract method (2) Syntax: access modifier abstract return value

See all articles