<?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>ORM Archives - Tomoshare</title>
	<atom:link href="https://blog.tomosia.com.vn/tag/orm/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.tomosia.com.vn/tag/orm/</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=7.0</generator>

<image>
	<url>https://blog.tomosia.com.vn/wp-content/uploads/2023/09/cropped-icon-32x32.png</url>
	<title>ORM Archives - Tomoshare</title>
	<link>https://blog.tomosia.com.vn/tag/orm/</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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">Đâ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 class="wp-block-paragraph">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 class="wp-block-paragraph">Ư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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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>14</slash:comments>
		
		
			</item>
		<item>
		<title>20 Laravel Eloquent Tips and Tricks (P1)</title>
		<link>https://blog.tomosia.com.vn/20-laravel-eloquent-tips-and-tricks-p1/</link>
					<comments>https://blog.tomosia.com.vn/20-laravel-eloquent-tips-and-tricks-p1/#comments</comments>
		
		<dc:creator><![CDATA[admin_tomosia]]></dc:creator>
		<pubDate>Mon, 02 Oct 2023 03:33:23 +0000</pubDate>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Laravel]]></category>
		<category><![CDATA[Eloquent]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Tricks]]></category>
		<category><![CDATA[ORM]]></category>
		<guid isPermaLink="false">https://blog.tomosia.com.vn/?p=205</guid>

					<description><![CDATA[<p>Eloquent ORM được sủ dụng rất nhiều trong 1 project Laravel, tuy nhiên để sử dụng được tối đa những gì Laravel cung cấp thì không phải ai cũng biết. Trong bài viết này mình sẽ chỉ cho các bạn một vài thủ thuật, hi vọng sẽ giúp ích cho các bạn trong một vài trường hợp cụ thể.</p>
<p>The post <a href="https://blog.tomosia.com.vn/20-laravel-eloquent-tips-and-tricks-p1/">20 Laravel Eloquent Tips and Tricks (P1)</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Eloquent ORM được sủ dụng rất nhiều trong 1 project Laravel, tuy nhiên để sử dụng được tối đa những gì Laravel cung cấp thì không phải ai cũng biết. Trong bài viết này mình sẽ chỉ cho các bạn một vài thủ thuật, hi vọng sẽ giúp ích cho các bạn trong một vài trường hợp cụ thể.</p>



<h2 id="1-increments-va-decrements" class="wp-block-heading">1. Increments và Decrements</h2>



<p class="wp-block-paragraph">Khi muốn update tăng 1 đơn vị cho 1 column thay vì viết như này.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" 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;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="$post = Post::find($postId);
$post-&gt;view_count++;
$post-&gt;save();" style="color:#F8F8F2;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" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F8F8F2">$post </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> </span><span style="color: #8BE9FD; font-style: italic">Post</span><span style="color: #FF79C6">::</span><span style="color: #50FA7B">find</span><span style="color: #F8F8F2">($postId);</span></span>
<span class="line"><span style="color: #F8F8F2">$post</span><span style="color: #FF79C6">-&gt;</span><span style="color: #F8F8F2">view_count</span><span style="color: #FF79C6">++</span><span style="color: #F8F8F2">;</span></span>
<span class="line"><span style="color: #F8F8F2">$post</span><span style="color: #FF79C6">-&gt;</span><span style="color: #50FA7B">save</span><span style="color: #F8F8F2">();</span></span></code></pre></div>



<p class="wp-block-paragraph">Bạn có thể viết lại như này</p>



<div class="wp-block-kevinbatdorf-code-block-pro" 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;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="$post = Post::find($postId);
$post-&gt;increment('view_count');" style="color:#F8F8F2;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" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F8F8F2">$post </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> </span><span style="color: #8BE9FD; font-style: italic">Post</span><span style="color: #FF79C6">::</span><span style="color: #50FA7B">find</span><span style="color: #F8F8F2">($postId);</span></span>
<span class="line"><span style="color: #F8F8F2">$post</span><span style="color: #FF79C6">-&gt;</span><span style="color: #50FA7B">increment</span><span style="color: #F8F8F2">(</span><span style="color: #E9F284">&#39;</span><span style="color: #F1FA8C">view_count</span><span style="color: #E9F284">&#39;</span><span style="color: #F8F8F2">);</span></span></code></pre></div>



<p class="wp-block-paragraph">Hoặc</p>



<div class="wp-block-kevinbatdorf-code-block-pro" 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;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="Post::find($postId)-&gt;increment('view_count');
Post::find($postId)-&gt;increment('view_count', 10); // +10
Product::find($productId)-&gt;decrement('stock'); // -1" style="color:#F8F8F2;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" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #8BE9FD; font-style: italic">Post</span><span style="color: #FF79C6">::</span><span style="color: #50FA7B">find</span><span style="color: #F8F8F2">($postId)</span><span style="color: #FF79C6">-&gt;</span><span style="color: #50FA7B">increment</span><span style="color: #F8F8F2">(</span><span style="color: #E9F284">&#39;</span><span style="color: #F1FA8C">view_count</span><span style="color: #E9F284">&#39;</span><span style="color: #F8F8F2">);</span></span>
<span class="line"><span style="color: #8BE9FD; font-style: italic">Post</span><span style="color: #FF79C6">::</span><span style="color: #50FA7B">find</span><span style="color: #F8F8F2">($postId)</span><span style="color: #FF79C6">-&gt;</span><span style="color: #50FA7B">increment</span><span style="color: #F8F8F2">(</span><span style="color: #E9F284">&#39;</span><span style="color: #F1FA8C">view_count</span><span style="color: #E9F284">&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">10</span><span style="color: #F8F8F2">); </span><span style="color: #6272A4">// +10</span></span>
<span class="line"><span style="color: #8BE9FD; font-style: italic">Product</span><span style="color: #FF79C6">::</span><span style="color: #50FA7B">find</span><span style="color: #F8F8F2">($productId)</span><span style="color: #FF79C6">-&gt;</span><span style="color: #50FA7B">decrement</span><span style="color: #F8F8F2">(</span><span style="color: #E9F284">&#39;</span><span style="color: #F1FA8C">stock</span><span style="color: #E9F284">&#39;</span><span style="color: #F8F8F2">); </span><span style="color: #6272A4">// -1</span></span></code></pre></div>



<h2 id="2-xory-methods" class="wp-block-heading">2. XorY methods</h2>



<p class="wp-block-paragraph">Laravel Eloquent có khả nhiều function kết hợp 2 methods kiểu như &#8220;hãy làm X trước nếu không thì làm Y&#8221;</p>



<ul class="wp-block-list">
<li><strong>findOrFail</strong></li>
</ul>



<div class="wp-block-kevinbatdorf-code-block-pro" 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;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="$user = User::find($id);
if (!$user) {
   abort(404);
}" style="color:#F8F8F2;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" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F8F8F2">$user </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> </span><span style="color: #8BE9FD; font-style: italic">User</span><span style="color: #FF79C6">::</span><span style="color: #50FA7B">find</span><span style="color: #F8F8F2">($id);</span></span>
<span class="line"><span style="color: #FF79C6">if</span><span style="color: #F8F8F2"> (</span><span style="color: #FF79C6">!</span><span style="color: #F8F8F2">$user) {</span></span>
<span class="line"><span style="color: #F8F8F2">   </span><span style="color: #50FA7B">abort</span><span style="color: #F8F8F2">(</span><span style="color: #BD93F9">404</span><span style="color: #F8F8F2">);</span></span>
<span class="line"><span style="color: #F8F8F2">}</span></span></code></pre></div>



<p class="wp-block-paragraph">↓</p>



<div class="wp-block-kevinbatdorf-code-block-pro" 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;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="$user = User::findOrFail($id);" style="color:#F8F8F2;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" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F8F8F2">$user </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> </span><span style="color: #8BE9FD; font-style: italic">User</span><span style="color: #FF79C6">::</span><span style="color: #50FA7B">findOrFail</span><span style="color: #F8F8F2">($id);</span></span></code></pre></div>



<ul class="wp-block-list">
<li><strong>firstOrCreate</strong></li>
</ul>



<div class="wp-block-kevinbatdorf-code-block-pro" 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;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="$user = User::where('email', $email)-&gt;first();
  if (!$user) {
  User::create([
  'email' =&gt; $email
  ]);
}" style="color:#F8F8F2;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" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F8F8F2">$user </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> </span><span style="color: #8BE9FD; font-style: italic">User</span><span style="color: #FF79C6">::</span><span style="color: #50FA7B">where</span><span style="color: #F8F8F2">(</span><span style="color: #E9F284">&#39;</span><span style="color: #F1FA8C">email</span><span style="color: #E9F284">&#39;</span><span style="color: #F8F8F2">, $email)</span><span style="color: #FF79C6">-&gt;</span><span style="color: #50FA7B">first</span><span style="color: #F8F8F2">();</span></span>
<span class="line"><span style="color: #F8F8F2">  </span><span style="color: #FF79C6">if</span><span style="color: #F8F8F2"> (</span><span style="color: #FF79C6">!</span><span style="color: #F8F8F2">$user) {</span></span>
<span class="line"><span style="color: #F8F8F2">  </span><span style="color: #8BE9FD; font-style: italic">User</span><span style="color: #FF79C6">::</span><span style="color: #50FA7B">create</span><span style="color: #F8F8F2">([</span></span>
<span class="line"><span style="color: #F8F8F2">  </span><span style="color: #E9F284">&#39;</span><span style="color: #F1FA8C">email</span><span style="color: #E9F284">&#39;</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">=&gt;</span><span style="color: #F8F8F2"> $email</span></span>
<span class="line"><span style="color: #F8F8F2">  ]);</span></span>
<span class="line"><span style="color: #F8F8F2">}</span></span></code></pre></div>



<p class="wp-block-paragraph">↓</p>



<div class="wp-block-kevinbatdorf-code-block-pro" 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;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="$user = User::firstOrCreate(['email' =&gt; $email]);" style="color:#F8F8F2;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" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F8F8F2">$user </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> </span><span style="color: #8BE9FD; font-style: italic">User</span><span style="color: #FF79C6">::</span><span style="color: #50FA7B">firstOrCreate</span><span style="color: #F8F8F2">([</span><span style="color: #E9F284">&#39;</span><span style="color: #F1FA8C">email</span><span style="color: #E9F284">&#39;</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">=&gt;</span><span style="color: #F8F8F2"> $email]);</span></span></code></pre></div>



<h2 id="3-model-boot-method" class="wp-block-heading">3. Model boot() method</h2>



<p class="wp-block-paragraph">Trong Laravel Eloquent có một function&nbsp;<code>boot()</code>&nbsp;cho phép bạn ghi đè lại các giá trị mặc định.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" 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;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="class User extends Model
{
    /**
    * @return void
    */
    public static function boot(): void
    {
        parent::boot();
        static::updating(function($model)
        {
            // do some logging
            // thay thế một số property, ví dụ $model-&gt;something = transform($something);
        });
    }
}" style="color:#F8F8F2;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" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #FF79C6">class</span><span style="color: #F8F8F2"> </span><span style="color: #8BE9FD">User</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">extends</span><span style="color: #F8F8F2"> </span><span style="color: #8BE9FD; font-style: italic">Model</span></span>
<span class="line"><span style="color: #F8F8F2">{</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #6272A4">/**</span></span>
<span class="line"><span style="color: #6272A4">    * </span><span style="color: #FF79C6">@return</span><span style="color: #6272A4"> </span><span style="color: #FF79C6">void</span></span>
<span class="line"><span style="color: #6272A4">    */</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #FF79C6">public</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">static</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">function</span><span style="color: #F8F8F2"> </span><span style="color: #50FA7B">boot</span><span style="color: #F8F8F2">()</span><span style="color: #FF79C6">:</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">void</span></span>
<span class="line"><span style="color: #F8F8F2">    {</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #8BE9FD; font-style: italic">parent</span><span style="color: #FF79C6">::</span><span style="color: #50FA7B">boot</span><span style="color: #F8F8F2">();</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #8BE9FD; font-style: italic">static</span><span style="color: #FF79C6">::</span><span style="color: #50FA7B">updating</span><span style="color: #F8F8F2">(</span><span style="color: #FF79C6">function</span><span style="color: #F8F8F2">($model)</span></span>
<span class="line"><span style="color: #F8F8F2">        {</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #6272A4">// do some logging</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #6272A4">// thay thế một số property, ví dụ $model-&gt;something = transform($something);</span></span>
<span class="line"><span style="color: #F8F8F2">        });</span></span>
<span class="line"><span style="color: #F8F8F2">    }</span></span>
<span class="line"><span style="color: #F8F8F2">}</span></span></code></pre></div>



<p class="wp-block-paragraph">Ứng dụng nhiều nhất của function này là set uuid cho đối tượng</p>



<div class="wp-block-kevinbatdorf-code-block-pro" 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;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="/**
* @return void
*/
public static function boot(): void
{
    parent::boot();
    self::creating(function ($model) {
        $model-&gt;uuid = (string)Uuid::generate();
    });
}" style="color:#F8F8F2;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" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #6272A4">/**</span></span>
<span class="line"><span style="color: #6272A4">* </span><span style="color: #FF79C6">@return</span><span style="color: #6272A4"> </span><span style="color: #FF79C6">void</span></span>
<span class="line"><span style="color: #6272A4">*/</span></span>
<span class="line"><span style="color: #FF79C6">public</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">static</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">function</span><span style="color: #F8F8F2"> </span><span style="color: #50FA7B">boot</span><span style="color: #F8F8F2">()</span><span style="color: #FF79C6">:</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">void</span></span>
<span class="line"><span style="color: #F8F8F2">{</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #8BE9FD; font-style: italic">parent</span><span style="color: #FF79C6">::</span><span style="color: #50FA7B">boot</span><span style="color: #F8F8F2">();</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #8BE9FD; font-style: italic">self</span><span style="color: #FF79C6">::</span><span style="color: #50FA7B">creating</span><span style="color: #F8F8F2">(</span><span style="color: #FF79C6">function</span><span style="color: #F8F8F2"> ($model) {</span></span>
<span class="line"><span style="color: #F8F8F2">        $model</span><span style="color: #FF79C6">-&gt;</span><span style="color: #F8F8F2">uuid </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> (</span><span style="color: #8BE9FD; font-style: italic">string</span><span style="color: #F8F8F2">)</span><span style="color: #8BE9FD; font-style: italic">Uuid</span><span style="color: #FF79C6">::</span><span style="color: #50FA7B">generate</span><span style="color: #F8F8F2">();</span></span>
<span class="line"><span style="color: #F8F8F2">    });</span></span>
<span class="line"><span style="color: #F8F8F2">}</span></span></code></pre></div>



<p class="wp-block-paragraph"></p>



<h2 id="4-them-dieu-kien-hoac-ordering-trong-relationship" class="wp-block-heading">4. Thêm điều kiện hoặc ordering trong relationship</h2>



<p class="wp-block-paragraph">Dưới đây là một cách mà các bạn thường dùng để định nghĩa một relationship</p>



<div class="wp-block-kevinbatdorf-code-block-pro" 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;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="/**
* @return mixed
*/
public function users()
{
    return $this-&gt;hasMany('App\User');    
}" style="color:#F8F8F2;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" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #6272A4">/**</span></span>
<span class="line"><span style="color: #6272A4">* </span><span style="color: #FF79C6">@return</span><span style="color: #6272A4"> </span><span style="color: #FF79C6">mixed</span></span>
<span class="line"><span style="color: #6272A4">*/</span></span>
<span class="line"><span style="color: #FF79C6">public</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">function</span><span style="color: #F8F8F2"> </span><span style="color: #50FA7B">users</span><span style="color: #F8F8F2">()</span></span>
<span class="line"><span style="color: #F8F8F2">{</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #FF79C6">return</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9; font-style: italic">$this</span><span style="color: #FF79C6">-&gt;</span><span style="color: #50FA7B">hasMany</span><span style="color: #F8F8F2">(</span><span style="color: #E9F284">&#39;</span><span style="color: #F1FA8C">App\User</span><span style="color: #E9F284">&#39;</span><span style="color: #F8F8F2">);    </span></span>
<span class="line"><span style="color: #F8F8F2">}</span></span></code></pre></div>



<p class="wp-block-paragraph">Tuy nhiên bạn hoàn toàn có thể thêm&nbsp;<code>where</code>&nbsp;hoặc&nbsp;<code>orderBy</code></p>



<p class="wp-block-paragraph">Ví dụ trong trường hợp cụ thể, bạn cần tạo quan hệ giữa bảng&nbsp;<code>categories</code>&nbsp;và&nbsp;<code>posts</code>&nbsp;nhưng thêm điều kiện là&nbsp;<code>post</code>&nbsp;phải có trạng thái là&nbsp;<code>APPROVED</code>&nbsp;và sắp xếp theo thứ tụ tăng dần.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" 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;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="/**
* @return mixed
*/
public function posts() 
{
    return $this-&gt;hasMany('App\Models\Category')-&gt;where('status', 'APPROVED')-&gt;orderBy('id', 'DESC');
}" style="color:#F8F8F2;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" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #6272A4">/**</span></span>
<span class="line"><span style="color: #6272A4">* </span><span style="color: #FF79C6">@return</span><span style="color: #6272A4"> </span><span style="color: #FF79C6">mixed</span></span>
<span class="line"><span style="color: #6272A4">*/</span></span>
<span class="line"><span style="color: #FF79C6">public</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">function</span><span style="color: #F8F8F2"> </span><span style="color: #50FA7B">posts</span><span style="color: #F8F8F2">() </span></span>
<span class="line"><span style="color: #F8F8F2">{</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #FF79C6">return</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9; font-style: italic">$this</span><span style="color: #FF79C6">-&gt;</span><span style="color: #50FA7B">hasMany</span><span style="color: #F8F8F2">(</span><span style="color: #E9F284">&#39;</span><span style="color: #F1FA8C">App\Models\Category</span><span style="color: #E9F284">&#39;</span><span style="color: #F8F8F2">)</span><span style="color: #FF79C6">-&gt;</span><span style="color: #50FA7B">where</span><span style="color: #F8F8F2">(</span><span style="color: #E9F284">&#39;</span><span style="color: #F1FA8C">status</span><span style="color: #E9F284">&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #E9F284">&#39;</span><span style="color: #F1FA8C">APPROVED</span><span style="color: #E9F284">&#39;</span><span style="color: #F8F8F2">)</span><span style="color: #FF79C6">-&gt;</span><span style="color: #50FA7B">orderBy</span><span style="color: #F8F8F2">(</span><span style="color: #E9F284">&#39;</span><span style="color: #F1FA8C">id</span><span style="color: #E9F284">&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #E9F284">&#39;</span><span style="color: #F1FA8C">DESC</span><span style="color: #E9F284">&#39;</span><span style="color: #F8F8F2">);</span></span>
<span class="line"><span style="color: #F8F8F2">}</span></span></code></pre></div>



<h2 id="5-model-properties-timestamps-appends" class="wp-block-heading">5. Model properties: timestamps, appends, &#8230;</h2>



<p class="wp-block-paragraph">Có một vài parameters của Eloquent Model, được thể hiện dưới dạng properties của class đó. Một số cái phổ biến nhất có thể là:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" 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;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="class User extends Model {
    protected $table = 'users';
    protected $fillable = ['email', 'password']; // Những fileds có thể được set giá trị bằng cách dùng User::create()
    protected $dates = ['created_at', 'deleted_at']; // Những fields sẽ được set bởi Carbon-ized
    protected $appends = ['field1', 'field2']; // Các giá trị bổ sung được trả về trong JSON 
}" style="color:#F8F8F2;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" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #FF79C6">class</span><span style="color: #F8F8F2"> </span><span style="color: #8BE9FD">User</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">extends</span><span style="color: #F8F8F2"> </span><span style="color: #8BE9FD; font-style: italic">Model</span><span style="color: #F8F8F2"> {</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #FF79C6">protected</span><span style="color: #F8F8F2"> $table </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> </span><span style="color: #E9F284">&#39;</span><span style="color: #F1FA8C">users</span><span style="color: #E9F284">&#39;</span><span style="color: #F8F8F2">;</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #FF79C6">protected</span><span style="color: #F8F8F2"> $fillable </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> [</span><span style="color: #E9F284">&#39;</span><span style="color: #F1FA8C">email</span><span style="color: #E9F284">&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #E9F284">&#39;</span><span style="color: #F1FA8C">password</span><span style="color: #E9F284">&#39;</span><span style="color: #F8F8F2">]; </span><span style="color: #6272A4">// Những fileds có thể được set giá trị bằng cách dùng User::create()</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #FF79C6">protected</span><span style="color: #F8F8F2"> $dates </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> [</span><span style="color: #E9F284">&#39;</span><span style="color: #F1FA8C">created_at</span><span style="color: #E9F284">&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #E9F284">&#39;</span><span style="color: #F1FA8C">deleted_at</span><span style="color: #E9F284">&#39;</span><span style="color: #F8F8F2">]; </span><span style="color: #6272A4">// Những fields sẽ được set bởi Carbon-ized</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #FF79C6">protected</span><span style="color: #F8F8F2"> $appends </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> [</span><span style="color: #E9F284">&#39;</span><span style="color: #F1FA8C">field1</span><span style="color: #E9F284">&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #E9F284">&#39;</span><span style="color: #F1FA8C">field2</span><span style="color: #E9F284">&#39;</span><span style="color: #F8F8F2">]; </span><span style="color: #6272A4">// Các giá trị bổ sung được trả về trong JSON </span></span>
<span class="line"><span style="color: #F8F8F2">}</span></span></code></pre></div>



<p class="wp-block-paragraph">Khoannnnnnnnnnnnnnnnnnn, Còn nữa&#8230;</p>



<div class="wp-block-kevinbatdorf-code-block-pro" 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;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="protected $primaryKey = 'uuid'; // Primary key k phải lúc nào cũng bắt buộc phải là id
public $incrementing = false; // và thậm chí k cần phải tự động tăng luông 
protected $perPage = 25; // Bạn có thể override số lượng data trong 1 page khi sủ dụng pagination, giá trị này default là 15
const CREATED_AT = 'created_at';
const UPDATED_AT = 'updated_at'; // Thay đổi được tên column created_at và updated_at luôn nè 
public $timestamps = false; // Hoặc khai báo là k cần sủ dụng chúng
protected $dateFormat = 'U'; //Hoặc bạn có thể thay đổi kiểu dữ liệu của chúng. Ví dụ chuyển created_at và updated_at sang integer thì làm như ví dụ này." style="color:#F8F8F2;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" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #FF79C6">protected</span><span style="color: #F8F8F2"> $primaryKey </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> </span><span style="color: #E9F284">&#39;</span><span style="color: #F1FA8C">uuid</span><span style="color: #E9F284">&#39;</span><span style="color: #F8F8F2">; </span><span style="color: #6272A4">// Primary key k phải lúc nào cũng bắt buộc phải là id</span></span>
<span class="line"><span style="color: #FF79C6">public</span><span style="color: #F8F8F2"> $incrementing </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9">false</span><span style="color: #F8F8F2">; </span><span style="color: #6272A4">// và thậm chí k cần phải tự động tăng luông </span></span>
<span class="line"><span style="color: #FF79C6">protected</span><span style="color: #F8F8F2"> $perPage </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9">25</span><span style="color: #F8F8F2">; </span><span style="color: #6272A4">// Bạn có thể override số lượng data trong 1 page khi sủ dụng pagination, giá trị này default là 15</span></span>
<span class="line"><span style="color: #FF79C6">const</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9">CREATED_AT</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> </span><span style="color: #E9F284">&#39;</span><span style="color: #F1FA8C">created_at</span><span style="color: #E9F284">&#39;</span><span style="color: #F8F8F2">;</span></span>
<span class="line"><span style="color: #FF79C6">const</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9">UPDATED_AT</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> </span><span style="color: #E9F284">&#39;</span><span style="color: #F1FA8C">updated_at</span><span style="color: #E9F284">&#39;</span><span style="color: #F8F8F2">; </span><span style="color: #6272A4">// Thay đổi được tên column created_at và updated_at luôn nè </span></span>
<span class="line"><span style="color: #FF79C6">public</span><span style="color: #F8F8F2"> $timestamps </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9">false</span><span style="color: #F8F8F2">; </span><span style="color: #6272A4">// Hoặc khai báo là k cần sủ dụng chúng</span></span>
<span class="line"><span style="color: #FF79C6">protected</span><span style="color: #F8F8F2"> $dateFormat </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> </span><span style="color: #E9F284">&#39;</span><span style="color: #F1FA8C">U</span><span style="color: #E9F284">&#39;</span><span style="color: #F8F8F2">; </span><span style="color: #6272A4">//Hoặc bạn có thể thay đổi kiểu dữ liệu của chúng. Ví dụ chuyển created_at và updated_at sang integer thì làm như ví dụ này.</span></span></code></pre></div>



<p class="wp-block-paragraph">Và tất nhiên là còn nhiều hơn nữa, trên đây mình đã liệt kê những cái thú vị nhất, để biết thêm chi tiết, vui lòng kiểm tra ở&nbsp;<code>abstract Model Class</code></p>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">To be continued&#8230;</p>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://blog.tomosia.com.vn/20-laravel-eloquent-tips-and-tricks-p1/">20 Laravel Eloquent Tips and Tricks (P1)</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.tomosia.com.vn/20-laravel-eloquent-tips-and-tricks-p1/feed/</wfw:commentRss>
			<slash:comments>10</slash:comments>
		
		
			</item>
	</channel>
</rss>
