<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:series="https://publishpress.com/"
	>

<channel>
	<title>Thien Tran, Author at Tomoshare</title>
	<atom:link href="https://blog.tomosia.com.vn/author/thientran/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.tomosia.com.vn/author/thientran/</link>
	<description>Kênh chia sẻ kiến thức Tomosia Việt Nam</description>
	<lastBuildDate>Tue, 19 Dec 2023 06:22:37 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://blog.tomosia.com.vn/wp-content/uploads/2023/09/cropped-icon-32x32.png</url>
	<title>Thien Tran, Author at Tomoshare</title>
	<link>https://blog.tomosia.com.vn/author/thientran/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Tản mạn về Object Relational Mapping</title>
		<link>https://blog.tomosia.com.vn/tan-man-ve-object-relational-mapping/</link>
					<comments>https://blog.tomosia.com.vn/tan-man-ve-object-relational-mapping/#comments</comments>
		
		<dc:creator><![CDATA[Thien Tran]]></dc:creator>
		<pubDate>Tue, 19 Dec 2023 06:22:34 +0000</pubDate>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[ORM]]></category>
		<guid isPermaLink="false">https://blog.tomosia.com.vn/?p=2238</guid>

					<description><![CDATA[<p>ORM là gì ? ORM là 1 kỹ thuật lập trình giúp ánh xạ các record dữ liệu&#8230;</p>
<p>The post <a href="https://blog.tomosia.com.vn/tan-man-ve-object-relational-mapping/">Tản mạn về Object Relational Mapping</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-group"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<h2 id="orm-la-gi" class="wp-block-heading">ORM là gì ?</h2>



<p>ORM là 1 <strong><em>kỹ thuật lập trình</em></strong> giúp ánh xạ các <strong>record</strong> dữ liệu trong hệ quản trị cơ sở dữ liệu sang dạng đối tượng đang định nghĩa trong các class &#8211; một khái niệm phổ biến được sử dụng trong tất cả các ngôn ngữ hiện đại ngày nay như: Java, PHP, Ruby. Bạn có thể áp dụng kĩ thật này với bất cứ dự án nào bạn thích</p>



<figure class="wp-block-image size-full"><img fetchpriority="high" decoding="async" width="700" height="359" src="http://blog.tomosia.com.vn/wp-content/uploads/2023/12/orm.webp" alt="" class="wp-image-2245" srcset="https://blog.tomosia.com.vn/wp-content/uploads/2023/12/orm.webp 700w, https://blog.tomosia.com.vn/wp-content/uploads/2023/12/orm-300x154.webp 300w, https://blog.tomosia.com.vn/wp-content/uploads/2023/12/orm-380x195.webp 380w" sizes="(max-width: 700px) 100vw, 700px" /></figure>



<p>Có hai patterns được áp dụng cho các cách thiết kế ORM khác nhau.</p>



<ul class="wp-block-list">
<li>Active Record: Một số ORM nổi tiếng sử dụng như: <strong><em>Eloquent, CachePHP, JOOQ, TOPLINK</em></strong></li>



<li>Data Mapper: Một số ORM nổi tiếng sử dụng như: <strong><em>Doctrine, Hibernate, SqlAlchemy</em></strong></li>
</ul>



<h2 id="orm-hoat-dong-nhu-the-nao" class="wp-block-heading">ORM hoạt động như thế nào ?</h2>



<p>Cơ bản thì ORM gói gọn CSDL trong 1 object, 1 phần sẽ chứa data phần còn lại sẽ xử lý để biến nó thành CSDL quan hệ.</p>



<p>ORM biểu thị các đối tượng ở đó dữ liệu được hiển thị dưới dạng Object</p>



<figure class="wp-block-image size-full"><img decoding="async" width="735" height="530" src="http://blog.tomosia.com.vn/wp-content/uploads/2023/12/orm1.webp" alt="" class="wp-image-2248" srcset="https://blog.tomosia.com.vn/wp-content/uploads/2023/12/orm1.webp 735w, https://blog.tomosia.com.vn/wp-content/uploads/2023/12/orm1-300x216.webp 300w, https://blog.tomosia.com.vn/wp-content/uploads/2023/12/orm1-380x274.webp 380w" sizes="(max-width: 735px) 100vw, 735px" /></figure>
</div></div>



<h2 id="uu-nhuoc-diem-cua-orm" class="wp-block-heading">Ưu nhược điểm của ORM</h2>



<p>Ví dụ về lấy danh sách người dùng cùng với bài đăng mới nhất của mỗi người dùng:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:16.854169845581055px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">PHP</span><span role="button" tabindex="0" data-code="$usersWithLatestPosts = DB::select('
    SELECT u.*, p.*
    FROM users u
    LEFT JOIN (
        SELECT user_id, MAX(created_at) AS latest_post_date
        FROM posts
        GROUP BY user_id
    ) latest_posts ON u.id = latest_posts.user_id
    LEFT JOIN posts p ON u.id = p.user_id AND latest_posts.latest_post_date = p.created_at
');" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F6F6F4">$usersWithLatestPosts </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">DB</span><span style="color: #F286C4">::</span><span style="color: #62E884">select</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&#39;</span></span>
<span class="line"><span style="color: #E7EE98">    SELECT u.*, p.*</span></span>
<span class="line"><span style="color: #E7EE98">    FROM users u</span></span>
<span class="line"><span style="color: #E7EE98">    LEFT JOIN (</span></span>
<span class="line"><span style="color: #E7EE98">        SELECT user_id, MAX(created_at) AS latest_post_date</span></span>
<span class="line"><span style="color: #E7EE98">        FROM posts</span></span>
<span class="line"><span style="color: #E7EE98">        GROUP BY user_id</span></span>
<span class="line"><span style="color: #E7EE98">    ) latest_posts ON u.id = latest_posts.user_id</span></span>
<span class="line"><span style="color: #E7EE98">    LEFT JOIN posts p ON u.id = p.user_id AND latest_posts.latest_post_date = p.created_at</span></span>
<span class="line"><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">);</span></span></code></pre></div>



<p>Đây là cách sử dụng ORM trong laravel</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:8.425346374511719px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">PHP</span><span role="button" tabindex="0" data-code="$usersWithLatestPosts = User::with(['posts' =&gt; function ($query) {
    $query-&gt;latest()-&gt;limit(1);
}])-&gt;get();" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F6F6F4">$usersWithLatestPosts </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">User</span><span style="color: #F286C4">::</span><span style="color: #62E884">with</span><span style="color: #F6F6F4">([</span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">posts</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">=&gt;</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">function</span><span style="color: #F6F6F4"> ($query) {</span></span>
<span class="line"><span style="color: #F6F6F4">    $query</span><span style="color: #F286C4">-&gt;</span><span style="color: #62E884">latest</span><span style="color: #F6F6F4">()</span><span style="color: #F286C4">-&gt;</span><span style="color: #62E884">limit</span><span style="color: #F6F6F4">(</span><span style="color: #BF9EEE">1</span><span style="color: #F6F6F4">);</span></span>
<span class="line"><span style="color: #F6F6F4">}])</span><span style="color: #F286C4">-&gt;</span><span style="color: #62E884">get</span><span style="color: #F6F6F4">();</span></span></code></pre></div>



<p>Như ví dụ ở trên chúng ta sẽ thấy rõ được 1 số ưu điểm khi sử dụng ORM đó là đoạn code sẽ ngắn gọn hơn, đọc vào dễ hiểu và thân thiện với coder hơn. Đó cũng là một ưu điểm nổi bật của ORM khi được áp dụng vào các dự án.</p>



<p>Ưu điểm:</p>



<ul class="wp-block-list">
<li><strong>Dễ sử dụng và đọc</strong></li>



<li><strong>Tính di động và linh hoạt</strong></li>



<li><strong>Bảo mật dữ liệu</strong></li>



<li><strong>Tương thích với quan hệ đối tượng</strong></li>



<li><strong>Tiết kiệm thời gian phát triển</strong></li>
</ul>



<p>Nhược điểm:</p>



<ul class="wp-block-list">
<li><strong>Hiệu suất không cao nhất</strong></li>



<li><strong>Tùy chỉnh phức tạp</strong></li>



<li><strong>Phụ thuộc vào ORM</strong></li>



<li><strong>Tối ưu hóa không linh hoạt</strong></li>
</ul>



<h2 id="conclusion" class="wp-block-heading">Conclusion</h2>



<p>Nên mix giữa ORM và Raw SQL sao cho hiệu quả. Với các truy vấn thông thường thì ORM là lựa chọn của mình. Với các tình huống phải thao tác với nhiều bản ghi, raw SQL có vẻ hợp lí hơn. Nhưng khi dùng raw sql bạn phải thực sự cẩn thận về vấn đề Sql Injection.</p>



<p>Cảm ơn các bạn đã theo dõi bài viết trên, trong bài viết có tham khảo từ một số nguồn khác. 🙏🙏🙏</p>
<p>The post <a href="https://blog.tomosia.com.vn/tan-man-ve-object-relational-mapping/">Tản mạn về Object Relational Mapping</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.tomosia.com.vn/tan-man-ve-object-relational-mapping/feed/</wfw:commentRss>
			<slash:comments>11</slash:comments>
		
		
			</item>
		<item>
		<title>Sort và filter dữ liệu dễ dàng hơn với Laravel Purity</title>
		<link>https://blog.tomosia.com.vn/sort-va-filter-du-lieu-de-dang-hon-voi-laravel-purity/</link>
					<comments>https://blog.tomosia.com.vn/sort-va-filter-du-lieu-de-dang-hon-voi-laravel-purity/#comments</comments>
		
		<dc:creator><![CDATA[Thien Tran]]></dc:creator>
		<pubDate>Sun, 10 Dec 2023 14:59:39 +0000</pubDate>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Laravel]]></category>
		<guid isPermaLink="false">https://blog.tomosia.com.vn/?p=2484</guid>

					<description><![CDATA[<p>Giới thiệu về Laravel Purity Laravel purity là một thư viện hỗ trợ filter và sort data một&#8230;</p>
<p>The post <a href="https://blog.tomosia.com.vn/sort-va-filter-du-lieu-de-dang-hon-voi-laravel-purity/">Sort và filter dữ liệu dễ dàng hơn với Laravel Purity</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 id="gioi-thieu-ve-laravel-purity" class="wp-block-heading">Giới thiệu về Laravel Purity</h2>



<p>Laravel purity là một thư viện hỗ trợ filter và sort data một cách dễ dàng đơn giản hỗ trợ trực tiếp cho laravel framework. Để biết được sự lợi hại của thư viện này. Hãy cùng mình mò mẫm nó nhé. Let&#8217;s gooooooo !!!</p>



<h2 id="dat-van-de" class="wp-block-heading">Đặt vấn đề</h2>



<p>Khi chúng ta viết api để filter nhiều giá trị cùng một lúc thì service của chúng ta sẽ khá dài dòng và rườm rà. Để viết ra một hàm filter dùng chung thì sẽ tốn khá nhiều thời gian và chất xám. Vì vậy thư viện này sinh ra với mục đích tối giản hơn về cách filter và sort dữ liệu.</p>



<h2 id="loi-ich-khi-su-dung" class="wp-block-heading">Lợi ích khi sử dụng</h2>



<p>Khi chúng ta viết một cách bình thường:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:16.859375px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">PHP</span><span role="button" tabindex="0" data-code="public function index(Request $request)
{
    $query = Post::query();

    // Lọc theo tiêu đề
    if ($request-&gt;has('title')) {
        $query-&gt;where('title', 'like', '%' . $request-&gt;input('title') . '%');
    }

    // Lọc theo nội dung (content)
    if ($request-&gt;has('content')) {
        $query-&gt;where('content', 'like', '%' . $request-&gt;input('content') . '%');
    }

    // Lọc theo ngày xuất bản (published_at)
    if ($request-&gt;has('published_at')) {
        $query-&gt;whereDate('published_at', '=', $request-&gt;input('published_at'));
    }

    $posts = $query-&gt;get();

    return response()-&gt;json($posts);
}" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">function</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">index</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1; font-style: italic">Request</span><span style="color: #F6F6F4"> $request)</span></span>
<span class="line"><span style="color: #F6F6F4">{</span></span>
<span class="line"><span style="color: #F6F6F4">    $query </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">Post</span><span style="color: #F286C4">::</span><span style="color: #62E884">query</span><span style="color: #F6F6F4">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #7B7F8B">// Lọc theo tiêu đề</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">if</span><span style="color: #F6F6F4"> ($request</span><span style="color: #F286C4">-&gt;</span><span style="color: #62E884">has</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">title</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">)) {</span></span>
<span class="line"><span style="color: #F6F6F4">        $query</span><span style="color: #F286C4">-&gt;</span><span style="color: #62E884">where</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">title</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">, </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">like</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">, </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">%</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">.</span><span style="color: #F6F6F4"> $request</span><span style="color: #F286C4">-&gt;</span><span style="color: #62E884">input</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">title</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">) </span><span style="color: #F286C4">.</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">%</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">);</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #7B7F8B">// Lọc theo nội dung (content)</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">if</span><span style="color: #F6F6F4"> ($request</span><span style="color: #F286C4">-&gt;</span><span style="color: #62E884">has</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">content</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">)) {</span></span>
<span class="line"><span style="color: #F6F6F4">        $query</span><span style="color: #F286C4">-&gt;</span><span style="color: #62E884">where</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">content</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">, </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">like</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">, </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">%</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">.</span><span style="color: #F6F6F4"> $request</span><span style="color: #F286C4">-&gt;</span><span style="color: #62E884">input</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">content</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">) </span><span style="color: #F286C4">.</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">%</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">);</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #7B7F8B">// Lọc theo ngày xuất bản (published_at)</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">if</span><span style="color: #F6F6F4"> ($request</span><span style="color: #F286C4">-&gt;</span><span style="color: #62E884">has</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">published_at</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">)) {</span></span>
<span class="line"><span style="color: #F6F6F4">        $query</span><span style="color: #F286C4">-&gt;</span><span style="color: #62E884">whereDate</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">published_at</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">, </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">=</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">, $request</span><span style="color: #F286C4">-&gt;</span><span style="color: #62E884">input</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">published_at</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">));</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">    $posts </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> $query</span><span style="color: #F286C4">-&gt;</span><span style="color: #62E884">get</span><span style="color: #F6F6F4">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">return</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">response</span><span style="color: #F6F6F4">()</span><span style="color: #F286C4">-&gt;</span><span style="color: #62E884">json</span><span style="color: #F6F6F4">($posts);</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre></div>



<p>Khi dùng thư viện trên </p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:8.4296875px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">PHP</span><span role="button" tabindex="0" data-code="public function index(Request $request)
{
    $query = Post::filter()-&gt;get();

    return response()-&gt;json($posts);
}" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">function</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">index</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1; font-style: italic">Request</span><span style="color: #F6F6F4"> $request)</span></span>
<span class="line"><span style="color: #F6F6F4">{</span></span>
<span class="line"><span style="color: #F6F6F4">    $query </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">Post</span><span style="color: #F286C4">::</span><span style="color: #62E884">filter</span><span style="color: #F6F6F4">()</span><span style="color: #F286C4">-&gt;</span><span style="color: #62E884">get</span><span style="color: #F6F6F4">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">return</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">response</span><span style="color: #F6F6F4">()</span><span style="color: #F286C4">-&gt;</span><span style="color: #62E884">json</span><span style="color: #F6F6F4">($posts);</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre></div>



<p><strong><em>Thật là ngắn gọn và súc tích phải không nào </em></strong>!!!</p>



<h2 id="cach-cai-dat-va-su-dung" class="wp-block-heading">Cách cài đặt và sử dụng</h2>



<p>Mở terminal của project lên và cài bằng composer nhé: </p>



<pre class="wp-block-code"><code>composer require abbasudo/laravel-purity </code></pre>



<pre class="wp-block-code"><code>php artisan vendor:publish --tag=purity </code></pre>



<p>Lệnh này để publish thư mục `config/purity` cho phép chúng ta có thể custom được filter mà chúng ta muốn.</p>



<p>Vậy là thư viện đã sẵn sàng để sử dụng. Tiếp theo hãy tìm tới Model mà bạn muốn filter nhé. Ở đây mình đang filter cho Model Post</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:16.859375px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">PHP</span><span role="button" tabindex="0" data-code="&lt;?php

namespace App\Models;

use Abbasudo\Purity\Traits\Filterable;
use Abbasudo\Purity\Traits\Sortable;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    use HasFactory;
    use Filterable;
    use Sortable;

    protected $filterFields = [
        'id',
        'title',
        'content',
        'published_at',
        'category_id',
        'category'
    ];

    public function category()
    {
        return $this-&gt;belongsTo(Category::class);
    }
}
" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">&lt;?</span><span style="color: #BF9EEE">php</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">namespace</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">App</span><span style="color: #F286C4; font-style: italic">\</span><span style="color: #97E1F1; font-style: italic">Models</span><span style="color: #F6F6F4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">use</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">Abbasudo</span><span style="color: #F286C4; font-style: italic">\</span><span style="color: #97E1F1; font-style: italic">Purity</span><span style="color: #F286C4; font-style: italic">\</span><span style="color: #97E1F1; font-style: italic">Traits</span><span style="color: #F286C4; font-style: italic">\</span><span style="color: #97E1F1; font-style: italic">Filterable</span><span style="color: #F6F6F4">;</span></span>
<span class="line"><span style="color: #F286C4">use</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">Abbasudo</span><span style="color: #F286C4; font-style: italic">\</span><span style="color: #97E1F1; font-style: italic">Purity</span><span style="color: #F286C4; font-style: italic">\</span><span style="color: #97E1F1; font-style: italic">Traits</span><span style="color: #F286C4; font-style: italic">\</span><span style="color: #97E1F1; font-style: italic">Sortable</span><span style="color: #F6F6F4">;</span></span>
<span class="line"><span style="color: #F286C4">use</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">Illuminate</span><span style="color: #F286C4; font-style: italic">\</span><span style="color: #97E1F1; font-style: italic">Database</span><span style="color: #F286C4; font-style: italic">\</span><span style="color: #97E1F1; font-style: italic">Eloquent</span><span style="color: #F286C4; font-style: italic">\</span><span style="color: #97E1F1; font-style: italic">Factories</span><span style="color: #F286C4; font-style: italic">\</span><span style="color: #97E1F1; font-style: italic">HasFactory</span><span style="color: #F6F6F4">;</span></span>
<span class="line"><span style="color: #F286C4">use</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">Illuminate</span><span style="color: #F286C4; font-style: italic">\</span><span style="color: #97E1F1; font-style: italic">Database</span><span style="color: #F286C4; font-style: italic">\</span><span style="color: #97E1F1; font-style: italic">Eloquent</span><span style="color: #F286C4; font-style: italic">\</span><span style="color: #97E1F1; font-style: italic">Model</span><span style="color: #F6F6F4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">class</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1">Post</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">extends</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">Model</span></span>
<span class="line"><span style="color: #F6F6F4">{</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">use</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">HasFactory</span><span style="color: #F6F6F4">;</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">use</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">Filterable</span><span style="color: #F6F6F4">;</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">use</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">Sortable</span><span style="color: #F6F6F4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">protected</span><span style="color: #F6F6F4"> $filterFields </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> [</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">id</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">,</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">title</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">,</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">content</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">,</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">published_at</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">,</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">category_id</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">,</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">category</span><span style="color: #DEE492">&#39;</span></span>
<span class="line"><span style="color: #F6F6F4">    ];</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">function</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">category</span><span style="color: #F6F6F4">()</span></span>
<span class="line"><span style="color: #F6F6F4">    {</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #F286C4">return</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE; font-style: italic">$this</span><span style="color: #F286C4">-&gt;</span><span style="color: #62E884">belongsTo</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1; font-style: italic">Category</span><span style="color: #F286C4">::class</span><span style="color: #F6F6F4">);</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span>
<span class="line"></span></code></pre></div>



<p>Các bạn chỉ cần Use Filterable và Sortable của thư viện để sử dụng. Mảng $filterFields là những giá trị mình muốn filter nhé. Ở đây mình có Category là relation của Post.</p>



<p>Tiếp theo trong function của mình dùng câu lệnh này nữa là oke nhoé :))</p>



<pre class="wp-block-code"><code>return Post::sort()->filter()->with('category')->get();</code></pre>



<p>Đây là một url để chúng ta filters nhé</p>



<pre class="wp-block-code"><code>GET /api/posts?filters&#91;field]&#91;operator]=value</code></pre>



<p>Dưới đây là một số operator mà thư viện hỗ trợ</p>



<figure class="wp-block-image size-large"><img decoding="async" width="799" height="1024" src="http://blog.tomosia.com.vn/wp-content/uploads/2023/12/Screenshot-2023-12-10-at-4.38.25-PM-799x1024.png" alt="" class="wp-image-2485" srcset="https://blog.tomosia.com.vn/wp-content/uploads/2023/12/Screenshot-2023-12-10-at-4.38.25-PM-799x1024.png 799w, https://blog.tomosia.com.vn/wp-content/uploads/2023/12/Screenshot-2023-12-10-at-4.38.25-PM-234x300.png 234w, https://blog.tomosia.com.vn/wp-content/uploads/2023/12/Screenshot-2023-12-10-at-4.38.25-PM-768x984.png 768w, https://blog.tomosia.com.vn/wp-content/uploads/2023/12/Screenshot-2023-12-10-at-4.38.25-PM-380x487.png 380w, https://blog.tomosia.com.vn/wp-content/uploads/2023/12/Screenshot-2023-12-10-at-4.38.25-PM-800x1025.png 800w, https://blog.tomosia.com.vn/wp-content/uploads/2023/12/Screenshot-2023-12-10-at-4.38.25-PM.png 1118w" sizes="(max-width: 799px) 100vw, 799px" /></figure>



<h2 id="test-ket-qua" class="wp-block-heading">Test kết quả</h2>



<p>Dưới đây là video mình test bằng Postman. Các bạn có thể test thử xem nhé!</p>



<figure class="wp-block-video"><video height="1740" style="aspect-ratio: 2866 / 1740;" width="2866" controls src="http://blog.tomosia.com.vn/wp-content/uploads/2023/12/demo-purity.mov"></video></figure>



<h2 id="tong-ket" class="wp-block-heading">Tổng kết</h2>



<p>Đây là một thư viện khá hay mà mình vô tình đọc được. Ở trên mình tập trung nhiều cho phần <strong><em>filter</em></strong>, còn <strong><em>sort</em></strong> cũng khá hay, các bạn khám phá thử xem nhá.</p>



<p>Hy vọng các bạn cảm thấy nó thú vị và có thể áp dụng vào dự án nếu có những tính năng tương tự. Cảm ơn mọi người đã dành thời gian đọc ạ ☺️☺️☺️</p>



<p><em>Nguồn:</em> </p>



<ul class="wp-block-list">
<li>Trang chủ của thư viện <a href="https://abbasudo.github.io/laravel-purity/">https://abbasudo.github.io/laravel-purity/</a></li>



<li><a href="https://laravel-news.com/filter-api-responses-with-laravel-purity?ref=dailydev">https://laravel-news.com/filter-api-responses-with-laravel-purity?ref=dailydev</a></li>
</ul>



<p></p>
<p>The post <a href="https://blog.tomosia.com.vn/sort-va-filter-du-lieu-de-dang-hon-voi-laravel-purity/">Sort và filter dữ liệu dễ dàng hơn với Laravel Purity</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.tomosia.com.vn/sort-va-filter-du-lieu-de-dang-hon-voi-laravel-purity/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		<enclosure url="http://blog.tomosia.com.vn/wp-content/uploads/2023/12/demo-purity.mov" length="38785537" type="video/quicktime" />

			</item>
	</channel>
</rss>
