<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                本篇為您講述ThinkPHP5.0的關聯定義和基礎用法,主要包括: - - [基本定義](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/145257#u57FAu672Cu5B9Au4E49) - [一對一關聯](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/145257#u4E00u5BF9u4E00u5173u8054) - [關聯定義](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/145257#u5173u8054u5B9Au4E49) - [關聯寫入](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/145257#u5173u8054u5199u5165) - [關聯查詢](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/145257#u5173u8054u67E5u8BE2) - [關聯更新](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/145257#u5173u8054u66F4u65B0) - [關聯刪除](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/145257#u5173u8054u5220u9664) - [一對多關聯](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/145257#u4E00u5BF9u591Au5173u8054) - [關聯定義](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/145257#u5173u8054u5B9Au4E49-1) - [關聯新增](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/145257#u5173u8054u65B0u589E) - [關聯查詢](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/145257#u5173u8054u67E5u8BE2-1) - [關聯更新](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/145257#u5173u8054u66F4u65B0-1) - [關聯刪除](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/145257#u5173u8054u5220u9664-1) - [多對多關聯](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/145257#u591Au5BF9u591Au5173u8054) - [關聯定義](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/145257#u5173u8054u5B9Au4E49-2) - [關聯新增](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/145257#u5173u8054u65B0u589E-1) - [關聯刪除](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/145257#u5173u8054u5220u9664-2) - [關聯查詢](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/145257#u5173u8054u67E5u8BE2-2) ## 基本定義 `ThinkPHP5.0`的關聯采用了對象化的操作模式,你無需繼承不同的模型類,只是把關聯定義成一個方法,并且直接通過當前模型對象的屬性名獲取定義的關聯數據。 舉個例子,有一個用戶模型`User`,有一個關聯的模型對象`Book`,每個用戶有多本書,`User`模型定義如下: ``` <pre class="calibre18"> ``` <span class="hljs-operator"><span class="hljs-number"><?php</span><span class="hljs-keyword">namespace</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">model</span>; <span class="hljs-keyword">use</span> <span class="hljs-title">think</span>\<span class="hljs-title">Model</span>; <span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">User</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Model</span></span>{ <span class="hljs-comment">// 定義關聯方法</span><span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">books</span><span class="hljs-number">()</span></span>{ <span class="hljs-keyword">return</span> <span class="hljs-regexp">$this</span>->hasMany(<span class="hljs-string">'Book'</span>); } }</span> ``` ``` > #### 提示: > > - - - - - - > > `User`模型的`books`方法就是一個關聯定義方法,方法名可以隨意命名,但注意要避免和`User`模型對象的字段屬性沖突。 實際獲取關聯數據的時候,就是采用下面的方式: ``` <pre class="calibre18"> ``` <span class="hljs-regexp">$user</span> = User::get(<span class="hljs-number">5</span>); <span class="hljs-comment">// 獲取User對象的nickname屬性</span><span class="hljs-keyword">echo</span> <span class="hljs-regexp">$user</span>->nickname; <span class="hljs-comment">// 獲取User對象的Book關聯對象</span> dump(<span class="hljs-regexp">$user</span>->books); <span class="hljs-comment">// 執行關聯的Book對象的查詢</span><span class="hljs-regexp">$user</span>->books()->where(<span class="hljs-string">'name'</span>,<span class="hljs-string">'thinkphp'</span>)->find(); ``` ``` 對于涉及的代碼用法,目前不用深究,后面會詳細描述。 一般來說,關聯關系包括: - 一對一關聯:`HAS_ONE` 以及相對的 `BELONGS_TO` - 一對多關聯:`HAS_MANY` 以及相對的 `BELONGS_TO` - 多對多關聯:`BELONGS_TO_MANY` 后面會詳細講解每一種關聯的用法。 ## 一對一關聯 一對一關聯是一種最簡單的關聯,例如每個用戶都有一份檔案,每個公司都有一個營業執照等等。 在這之前,我們先創建數據表如下: ``` <pre class="calibre18"> ``` <span class="hljs-operator"><span class="hljs-keyword">DROP</span> <span class="hljs-keyword">TABLE</span> <span class="hljs-keyword">IF</span> <span class="hljs-keyword">EXISTS</span> <span class="hljs-string">`think_user`</span>;</span> <span class="hljs-operator"><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">TABLE</span> <span class="hljs-keyword">IF</span> <span class="hljs-keyword">NOT</span> <span class="hljs-keyword">EXISTS</span> <span class="hljs-string">`think_user`</span> ( <span class="hljs-string">`id`</span> <span class="hljs-number">int</span>(<span class="hljs-number">6</span>) <span class="hljs-keyword">UNSIGNED</span> <span class="hljs-keyword">NOT</span> <span class="hljs-number">NULL</span> AUTO_INCREMENT, <span class="hljs-string">`nickname`</span> <span class="hljs-number">varchar</span>(<span class="hljs-number">25</span>) <span class="hljs-keyword">NOT</span> <span class="hljs-number">NULL</span>, <span class="hljs-string">`name`</span> <span class="hljs-number">varchar</span>(<span class="hljs-number">25</span>) <span class="hljs-keyword">NOT</span> <span class="hljs-number">NULL</span>, <span class="hljs-string">`password`</span> <span class="hljs-number">varchar</span>(<span class="hljs-number">50</span>) <span class="hljs-keyword">NOT</span> <span class="hljs-number">NULL</span>, <span class="hljs-string">`create_time`</span> <span class="hljs-number">int</span>(<span class="hljs-number">11</span>) <span class="hljs-keyword">UNSIGNED</span> <span class="hljs-keyword">NOT</span> <span class="hljs-number">NULL</span>, <span class="hljs-string">`update_time`</span> <span class="hljs-number">int</span>(<span class="hljs-number">11</span>) <span class="hljs-keyword">UNSIGNED</span> <span class="hljs-keyword">NOT</span> <span class="hljs-number">NULL</span>, <span class="hljs-string">`status`</span> tinyint(<span class="hljs-number">1</span>) <span class="hljs-keyword">DEFAULT</span> <span class="hljs-number">0</span>, PRIMARY <span class="hljs-keyword">KEY</span> (<span class="hljs-string">`id`</span>) ) <span class="hljs-keyword">ENGINE</span>=MyISAM <span class="hljs-keyword">DEFAULT</span> <span class="hljs-keyword">CHARSET</span>=utf8;</span> <span class="hljs-operator"><span class="hljs-keyword">DROP</span> <span class="hljs-keyword">TABLE</span> <span class="hljs-keyword">IF</span> <span class="hljs-keyword">EXISTS</span> <span class="hljs-string">`think_profile`</span>;</span> <span class="hljs-operator"><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">TABLE</span> <span class="hljs-keyword">IF</span> <span class="hljs-keyword">NOT</span> <span class="hljs-keyword">EXISTS</span> <span class="hljs-string">`think_profile`</span> ( <span class="hljs-string">`id`</span> <span class="hljs-number">int</span>(<span class="hljs-number">6</span>) <span class="hljs-keyword">UNSIGNED</span> <span class="hljs-keyword">NOT</span> <span class="hljs-number">NULL</span> AUTO_INCREMENT, <span class="hljs-string">`truename`</span> <span class="hljs-number">varchar</span>(<span class="hljs-number">25</span>) <span class="hljs-keyword">NOT</span> <span class="hljs-number">NULL</span>, <span class="hljs-string">`birthday`</span> <span class="hljs-number">int</span>(<span class="hljs-number">11</span>) <span class="hljs-keyword">NOT</span> <span class="hljs-number">NULL</span>, <span class="hljs-string">`address`</span> <span class="hljs-number">varchar</span>(<span class="hljs-number">255</span>) <span class="hljs-keyword">DEFAULT</span> <span class="hljs-number">NULL</span>, <span class="hljs-string">`email`</span> <span class="hljs-number">varchar</span>(<span class="hljs-number">255</span>) <span class="hljs-keyword">DEFAULT</span> <span class="hljs-number">NULL</span>, <span class="hljs-string">`user_id`</span> <span class="hljs-number">int</span>(<span class="hljs-number">6</span>) <span class="hljs-keyword">UNSIGNED</span> <span class="hljs-keyword">NOT</span> <span class="hljs-number">NULL</span>, PRIMARY <span class="hljs-keyword">KEY</span> (<span class="hljs-string">`id`</span>) ) <span class="hljs-keyword">ENGINE</span>=MyISAM <span class="hljs-keyword">DEFAULT</span> <span class="hljs-keyword">CHARSET</span>=utf8;</span> ``` ``` ### 關聯定義 我們以用戶和檔案的一對一關聯為例,在`User`模型類中添加關聯定義方法,然后在方法中調用`hasOne`方法即可: ``` <pre class="calibre18"> ``` <span class="hljs-operator"><span class="hljs-number"><?php</span><span class="hljs-keyword">namespace</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">model</span>; <span class="hljs-keyword">use</span> <span class="hljs-title">think</span>\<span class="hljs-title">Model</span>; <span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">User</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Model</span></span>{ <span class="hljs-comment">// 開啟自動寫入時間戳</span><span class="hljs-keyword">protected</span> <span class="hljs-regexp">$autoWriteTimestamp</span> = <span class="hljs-keyword">true</span>; <span class="hljs-comment">// 定義自動完成的屬性</span><span class="hljs-keyword">protected</span> <span class="hljs-regexp">$insert</span> = [<span class="hljs-string">'status'</span> => <span class="hljs-number">1</span>]; <span class="hljs-comment">// 定義關聯方法</span><span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">profile</span><span class="hljs-number">()</span></span>{ <span class="hljs-comment">// 用戶HAS ONE檔案關聯</span><span class="hljs-keyword">return</span> <span class="hljs-regexp">$this</span>->hasOne(<span class="hljs-string">'Profile'</span>); } }</span> ``` ``` hasOne方法有5個參數,依次分別是: > #### hasOne('關聯模型名','關聯外鍵','主鍵','別名定義','join類型') 默認的外鍵是:**當前模型名\_id**,主鍵則是自動獲取,如果你的表設計符合這一規范的話,只需要設置關聯的模型名即可. 通常關聯模型和當前模型都是相同的命名空間,如果關聯模型在不同的命名空間,需要指定完整的類名,例如: ``` <pre class="calibre18"> ``` <span class="hljs-comment">// 關聯admin模塊下面的模型對象</span><span class="hljs-keyword">return</span> <span class="hljs-regexp">$this</span>->hasOne(<span class="hljs-string">'\app\admin\Profile'</span>); ``` ``` 在關聯查詢的時候,默認使用當前模型的名稱(小寫)作為數據表別名,可以指定查詢使用的數據表別名,例如: ``` <pre class="calibre18"> ``` <span class="hljs-comment">// 用戶HAS ONE檔案關聯</span><span class="hljs-keyword">return</span> <span class="hljs-regexp">$this</span>->hasOne(<span class="hljs-string">'Profile'</span>,<span class="hljs-string">'user_id'</span>,<span class="hljs-string">'id'</span>,[<span class="hljs-string">'user'</span>=><span class="hljs-string">'member'</span>,<span class="hljs-string">'profile'</span>=><span class="hljs-string">'info'</span>]); ``` ``` 要進行模型的關聯操作,我們必須同時定義好關聯模型,`Profile`模型定義如下: ``` <pre class="calibre18"> ``` <?php namespace app\index\model; use think\<span class="hljs-operator">Model</span>; <span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">Profile</span> <span class="hljs-keyword"><span class="hljs-operator">extends</span></span> <span class="hljs-title">Model</span></span>{ <span class="hljs-keyword">protected</span> $<span class="hljs-operator"><span class="hljs-keyword">type</span> =</span> [ <span class="hljs-operator">'birthda</span>y' => <span class="hljs-operator">'timestamp</span>:<span class="hljs-operator">Y</span>-m-d', ]; } ``` ``` 可以看到`Profile`模型中并沒有定義關聯方法。如果你的關聯操作都是基于`User`模型的話,`Profile`模型中并不需要定義關聯方法。 如果你需要基于`Profile`模型來進行關聯操作,則需要在`Profile`模型中定義對應的`BELONGS_TO`關聯,如下: ``` <pre class="calibre18"> ``` <span class="hljs-operator"><span class="hljs-number"><?php</span><span class="hljs-keyword">namespace</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">model</span>; <span class="hljs-keyword">use</span> <span class="hljs-title">think</span>\<span class="hljs-title">Model</span>; <span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">Profile</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Model</span></span>{ <span class="hljs-keyword">protected</span> <span class="hljs-regexp">$type</span> = [ <span class="hljs-string">'birthday'</span> => <span class="hljs-string">'timestamp:Y-m-d'</span>, ]; <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">user</span><span class="hljs-number">()</span></span>{ <span class="hljs-comment">// 檔案 BELONGS TO 關聯用戶</span><span class="hljs-keyword">return</span> <span class="hljs-regexp">$this</span>->belongsTo(<span class="hljs-string">'User'</span>); } }</span> ``` ``` `belongsTo`方法和`hasOne`一樣,也有5個參數: > #### belongsTo('關聯模型名','關聯外鍵','關聯模型主鍵','別名定義','join類型') ### 關聯寫入 首先來看下如何進行關聯數據的寫入,創建User控制器的add操作方法如下: ``` <pre class="calibre18"> ``` <span class="hljs-operator"><span class="hljs-number"><?php</span><span class="hljs-keyword">namespace</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">controller</span>; <span class="hljs-keyword">use</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">model</span>\<span class="hljs-title">Profile</span>; <span class="hljs-keyword">use</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">model</span>\<span class="hljs-title">User</span> <span class="hljs-title">as</span> <span class="hljs-title">UserModel</span>; <span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">User</span></span>{ <span class="hljs-comment">// 關聯新增數據</span><span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">add</span><span class="hljs-number">()</span></span>{ <span class="hljs-regexp">$user</span> = <span class="hljs-keyword">new</span> UserModel; <span class="hljs-regexp">$user</span>->name = <span class="hljs-string">'thinkphp'</span>; <span class="hljs-regexp">$user</span>->password = <span class="hljs-string">'123456'</span>; <span class="hljs-regexp">$user</span>->nickname = <span class="hljs-string">'流年'</span>; <span class="hljs-keyword">if</span> (<span class="hljs-regexp">$user</span>->save()) { <span class="hljs-comment">// 寫入關聯數據</span><span class="hljs-regexp">$profile</span> = <span class="hljs-keyword">new</span> Profile; <span class="hljs-regexp">$profile</span>->truename = <span class="hljs-string">'劉晨'</span>; <span class="hljs-regexp">$profile</span>->birthday = <span class="hljs-string">'1977-03-05'</span>; <span class="hljs-regexp">$profile</span>->address = <span class="hljs-string">'中國上海'</span>; <span class="hljs-regexp">$profile</span>->email = <span class="hljs-string">'thinkphp@qq.com'</span>; <span class="hljs-regexp">$user</span>->profile()->save(<span class="hljs-regexp">$profile</span>); <span class="hljs-keyword">return</span> <span class="hljs-string">'用戶新增成功'</span>; } <span class="hljs-keyword">else</span> { <span class="hljs-keyword">return</span> <span class="hljs-regexp">$user</span>->getError(); } } }</span> ``` ``` 關聯模型的寫入調用了關聯方法`profile()`,該方法返回的是一個`Relation`對象,執行`save`方法會自動傳入當前模型`User`的主鍵作為關聯鍵值,所以不需要手動傳入`Profile`模型的`user_id`屬性。 `save`方法也可以直接使用數組而不是`Profile`對象,例如: ``` <pre class="calibre18"> ``` <span class="hljs-operator"><span class="hljs-number"><?php</span><span class="hljs-keyword">namespace</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">controller</span>; <span class="hljs-keyword">use</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">model</span>\<span class="hljs-title">Profile</span>; <span class="hljs-keyword">use</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">model</span>\<span class="hljs-title">User</span> <span class="hljs-title">as</span> <span class="hljs-title">UserModel</span>; <span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">User</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Controller</span></span>{ <span class="hljs-comment">// 關聯新增數據</span><span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">add</span><span class="hljs-number">()</span></span>{ <span class="hljs-regexp">$user</span> = <span class="hljs-keyword">new</span> UserModel; <span class="hljs-regexp">$user</span>->name = <span class="hljs-string">'thinkphp'</span>; <span class="hljs-regexp">$user</span>->password = <span class="hljs-string">'123456'</span>; <span class="hljs-regexp">$user</span>->nickname = <span class="hljs-string">'流年'</span>; <span class="hljs-keyword">if</span> (<span class="hljs-regexp">$user</span>->save()) { <span class="hljs-comment">// 寫入關聯數據</span><span class="hljs-regexp">$profile</span>[<span class="hljs-string">'truename'</span>] = <span class="hljs-string">'劉晨'</span>; <span class="hljs-regexp">$profile</span>[<span class="hljs-string">'birthday'</span>] = <span class="hljs-string">'1977-03-05'</span>; <span class="hljs-regexp">$profile</span>[<span class="hljs-string">'address'</span>] = <span class="hljs-string">'中國上海'</span>; <span class="hljs-regexp">$profile</span>[<span class="hljs-string">'email'</span>] = <span class="hljs-string">'thinkphp@qq.com'</span>; <span class="hljs-regexp">$user</span>->profile()->save(<span class="hljs-regexp">$profile</span>); <span class="hljs-keyword">return</span> <span class="hljs-string">'用戶[ '</span> . <span class="hljs-regexp">$user</span>->name . <span class="hljs-string">' ]新增成功'</span>; } <span class="hljs-keyword">else</span> { <span class="hljs-keyword">return</span> <span class="hljs-regexp">$user</span>->getError(); } } }</span> ``` ``` ### 關聯查詢 一對一的關聯查詢很簡單,直接把關聯對象當成屬性來用即可,例如: ``` <pre class="calibre18"> ``` <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">read</span><span class="hljs-number">(<span class="hljs-regexp">$id</span>)</span></span>{ <span class="hljs-regexp">$user</span> = UserModel::get(<span class="hljs-regexp">$id</span>); <span class="hljs-keyword">echo</span> <span class="hljs-regexp">$user</span>->name . <span class="hljs-string">'<br/>'</span>; <span class="hljs-keyword">echo</span> <span class="hljs-regexp">$user</span>->nickname . <span class="hljs-string">'<br/>'</span>; <span class="hljs-keyword">echo</span> <span class="hljs-regexp">$user</span>->profile->truename . <span class="hljs-string">'<br/>'</span>; <span class="hljs-keyword">echo</span> <span class="hljs-regexp">$user</span>->profile->email . <span class="hljs-string">'<br/>'</span>; } ``` ``` 訪問URL地址: ``` <pre class="calibre18"> ``` <span class="hljs-string">http:</span> <span class="hljs-comment">//tp5.com/user/1</span> ``` ``` 最后輸出結果為: ``` <pre class="calibre18"> ``` <span class="hljs-title">thinkphp</span> 流年 劉晨 thinkphp<span class="hljs-regexp">@qq</span>.com ``` ``` 以上關聯查詢的時候,只有在獲取關聯對象(`$user->profile`)的時候才會進行實際的關聯查詢,缺點是會可能進行多次查詢,但可以使用預載入查詢來提高查詢性能,對于一對一關聯來說,只需要進行一次查詢即可獲取關聯對象數據,例如: ``` <pre class="calibre18"> ``` <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">read</span><span class="hljs-number">(<span class="hljs-regexp">$id</span>)</span></span>{ <span class="hljs-regexp">$user</span> = UserModel::get(<span class="hljs-regexp">$id</span>,<span class="hljs-string">'profile'</span>); <span class="hljs-keyword">echo</span> <span class="hljs-regexp">$user</span>->name . <span class="hljs-string">'<br/>'</span>; <span class="hljs-keyword">echo</span> <span class="hljs-regexp">$user</span>->nickname . <span class="hljs-string">'<br/>'</span>; <span class="hljs-keyword">echo</span> <span class="hljs-regexp">$user</span>->profile->truename . <span class="hljs-string">'<br/>'</span>; <span class="hljs-keyword">echo</span> <span class="hljs-regexp">$user</span>->profile->email . <span class="hljs-string">'<br/>'</span>; } ``` ``` get方法使用第二個參數就表示進行關聯預載入查詢。 ### 關聯更新 一對一的關聯更新如下: ``` <pre class="calibre18"> ``` <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">update</span><span class="hljs-number">(<span class="hljs-regexp">$id</span>)</span></span>{ <span class="hljs-regexp">$user</span> = UserModel::get(<span class="hljs-regexp">$id</span>); <span class="hljs-regexp">$user</span>->name = <span class="hljs-string">'framework'</span>; <span class="hljs-keyword">if</span> (<span class="hljs-regexp">$user</span>->save()) { <span class="hljs-comment">// 更新關聯數據</span><span class="hljs-regexp">$user</span>->profile->email = <span class="hljs-string">'liu21st@gmail.com'</span>; <span class="hljs-regexp">$user</span>->profile->save(); <span class="hljs-keyword">return</span> <span class="hljs-string">'用戶[ '</span> . <span class="hljs-regexp">$user</span>->name . <span class="hljs-string">' ]更新成功'</span>; } <span class="hljs-keyword">else</span> { <span class="hljs-keyword">return</span> <span class="hljs-regexp">$user</span>->getError(); } } ``` ``` 訪問URL地址: ``` <pre class="calibre18"> ``` <span class="hljs-string">http:</span> <span class="hljs-comment">//tp5.com/user/update/1</span> ``` ``` 最后輸出結果為: ``` <pre class="calibre18"> ``` 用戶更新成 ``` ``` ### 關聯刪除 關聯刪除代碼如下: ``` <pre class="calibre18"> ``` <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">delete</span><span class="hljs-number">(<span class="hljs-regexp">$id</span>)</span></span>{ <span class="hljs-regexp">$user</span> = UserModel::get(<span class="hljs-regexp">$id</span>); <span class="hljs-keyword">if</span> (<span class="hljs-regexp">$user</span>->delete()) { <span class="hljs-comment">// 刪除關聯數據</span><span class="hljs-regexp">$user</span>->profile->delete(); <span class="hljs-keyword">return</span> <span class="hljs-string">'用戶[ '</span> . <span class="hljs-regexp">$user</span>->name . <span class="hljs-string">' ]刪除成功'</span>; } <span class="hljs-keyword">else</span> { <span class="hljs-keyword">return</span> <span class="hljs-regexp">$user</span>->getError(); } } ``` ``` 訪問URL地址: ``` <pre class="calibre18"> ``` <span class="hljs-string">http:</span> <span class="hljs-comment">//tp5.com/user/delete/1</span> ``` ``` 頁面輸出結果為: ``` <pre class="calibre18"> ``` 用戶刪除成功 ``` ``` ## 一對多關聯 每個作者寫有多本書就是一個典型的一對多關聯,首先創建如下數據表: ``` <pre class="calibre18"> ``` <span class="hljs-operator"><span class="hljs-keyword">DROP</span> <span class="hljs-keyword">TABLE</span> <span class="hljs-keyword">IF</span> <span class="hljs-keyword">EXISTS</span> <span class="hljs-string">`think_book`</span>;</span> <span class="hljs-operator"><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">TABLE</span> <span class="hljs-keyword">IF</span> <span class="hljs-keyword">NOT</span> <span class="hljs-keyword">EXISTS</span> <span class="hljs-string">`think_book`</span> ( <span class="hljs-string">`id`</span> <span class="hljs-number">int</span>(<span class="hljs-number">8</span>) <span class="hljs-keyword">UNSIGNED</span> <span class="hljs-keyword">NOT</span> <span class="hljs-number">NULL</span> AUTO_INCREMENT, <span class="hljs-string">`title`</span> <span class="hljs-number">varchar</span>(<span class="hljs-number">255</span>) <span class="hljs-keyword">NOT</span> <span class="hljs-number">NULL</span>, <span class="hljs-string">`publish_time`</span> <span class="hljs-number">int</span>(<span class="hljs-number">11</span>) <span class="hljs-keyword">UNSIGNED</span> <span class="hljs-keyword">DEFAULT</span> <span class="hljs-number">NULL</span>, <span class="hljs-string">`create_time`</span> <span class="hljs-number">int</span>(<span class="hljs-number">11</span>) <span class="hljs-keyword">UNSIGNED</span> <span class="hljs-keyword">NOT</span> <span class="hljs-number">NULL</span>, <span class="hljs-string">`update_time`</span> <span class="hljs-number">int</span>(<span class="hljs-number">11</span>) <span class="hljs-keyword">UNSIGNED</span> <span class="hljs-keyword">NOT</span> <span class="hljs-number">NULL</span>, <span class="hljs-string">`status`</span> tinyint(<span class="hljs-number">1</span>) <span class="hljs-keyword">NOT</span> <span class="hljs-number">NULL</span>, <span class="hljs-string">`user_id`</span> <span class="hljs-number">int</span>(<span class="hljs-number">6</span>) <span class="hljs-keyword">UNSIGNED</span> <span class="hljs-keyword">NOT</span> <span class="hljs-number">NULL</span>, PRIMARY <span class="hljs-keyword">KEY</span> (<span class="hljs-string">`id`</span>) ) <span class="hljs-keyword">ENGINE</span>=MyISAM <span class="hljs-keyword">DEFAULT</span> <span class="hljs-keyword">CHARSET</span>=utf8;</span> ``` ``` ### 關聯定義 在`User`模型類添加`Book`關聯如下: ``` <pre class="calibre18"> ``` <span class="hljs-operator"><span class="hljs-number"><?php</span><span class="hljs-keyword">namespace</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">model</span>; <span class="hljs-keyword">use</span> <span class="hljs-title">think</span>\<span class="hljs-title">Model</span>; <span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">User</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Model</span></span>{ <span class="hljs-comment">// 開啟自動寫入時間戳</span><span class="hljs-keyword">protected</span> <span class="hljs-regexp">$autoWriteTimestamp</span> = <span class="hljs-keyword">true</span>; <span class="hljs-comment">// 定義自動完成的屬性</span><span class="hljs-keyword">protected</span> <span class="hljs-regexp">$insert</span> = [<span class="hljs-string">'status'</span> => <span class="hljs-number">1</span>]; <span class="hljs-comment">// 定義關聯方法</span><span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">profile</span><span class="hljs-number">()</span></span>{ <span class="hljs-keyword">return</span> <span class="hljs-regexp">$this</span>->hasOne(<span class="hljs-string">'Profile'</span>); } <span class="hljs-comment">// 定義關聯</span><span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">books</span><span class="hljs-number">()</span></span>{ <span class="hljs-keyword">return</span> <span class="hljs-regexp">$this</span>->hasMany(<span class="hljs-string">'Book'</span>); } }</span> ``` ``` `hasMany`的參數如下: > #### hasMany('關聯模型名','關聯外鍵','關聯模型主鍵','別名定義') `Book`模型類定義如下: ``` <pre class="calibre18"> ``` <?php namespace app\index\model; use think\<span class="hljs-operator">Model</span>; <span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">Book</span> <span class="hljs-keyword"><span class="hljs-operator">extends</span></span> <span class="hljs-title">Model</span></span>{ <span class="hljs-keyword">protected</span> $<span class="hljs-operator"><span class="hljs-keyword">type</span> =</span> [ <span class="hljs-operator">'publish_tim</span>e' => <span class="hljs-operator">'timestamp</span>:<span class="hljs-operator">Y</span>-m-d', ]; <span class="hljs-comment">// 開啟自動寫入時間戳</span><span class="hljs-keyword">protected</span> $autoWriteTimestamp = <span class="hljs-number">true</span>; <span class="hljs-comment">// 定義自動完成的屬性</span><span class="hljs-keyword">protected</span> $insert = [<span class="hljs-operator">'statu</span>s' => <span class="hljs-number">1</span>]; } ``` ``` 如果需要定義對應的關聯,則可以使用`belongsTo`方法: ``` <pre class="calibre18"> ``` <span class="hljs-operator"><span class="hljs-number"><?php</span><span class="hljs-keyword">namespace</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">model</span>; <span class="hljs-keyword">use</span> <span class="hljs-title">think</span>\<span class="hljs-title">Model</span>; <span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">Book</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Model</span></span>{ <span class="hljs-keyword">protected</span> <span class="hljs-regexp">$type</span> = [ <span class="hljs-string">'publish_time'</span> => <span class="hljs-string">'timestamp:Y-m-d'</span>, ]; <span class="hljs-comment">// 開啟自動寫入時間戳</span><span class="hljs-keyword">protected</span> <span class="hljs-regexp">$autoWriteTimestamp</span> = <span class="hljs-keyword">true</span>; <span class="hljs-comment">// 定義自動完成的屬性</span><span class="hljs-keyword">protected</span> <span class="hljs-regexp">$insert</span> = [<span class="hljs-string">'status'</span> => <span class="hljs-number">1</span>]; <span class="hljs-comment">// 定義關聯方法</span><span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">user</span><span class="hljs-number">()</span></span>{ <span class="hljs-keyword">return</span> <span class="hljs-regexp">$this</span>->belongsTo(<span class="hljs-string">'User'</span>); } }</span> ``` ``` ### 關聯新增 添加`addBook`方法用于新增關聯數據: ``` <pre class="calibre18"> ``` <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">addBook</span><span class="hljs-number">()</span></span>{ <span class="hljs-regexp">$user</span> = UserModel::get(<span class="hljs-number">1</span>); <span class="hljs-regexp">$book</span> = <span class="hljs-keyword">new</span> Book; <span class="hljs-regexp">$book</span>->title = <span class="hljs-string">'ThinkPHP5快速入門'</span>; <span class="hljs-regexp">$book</span>->publish_time = <span class="hljs-string">'2016-05-06'</span>; <span class="hljs-regexp">$user</span>->books()->save(<span class="hljs-regexp">$book</span>); <span class="hljs-keyword">return</span> <span class="hljs-string">'添加Book成功'</span>; } ``` ``` 對于一對多關聯,也可以批量增加數據: ``` <pre class="calibre18"> ``` <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">addBook</span><span class="hljs-number">()</span></span>{ <span class="hljs-regexp">$user</span> = UserModel::get(<span class="hljs-number">1</span>); <span class="hljs-regexp">$books</span> = [ [<span class="hljs-string">'title'</span> => <span class="hljs-string">'ThinkPHP5快速入門'</span>, <span class="hljs-string">'publish_time'</span> => <span class="hljs-string">'2016-05-06'</span>], [<span class="hljs-string">'title'</span> => <span class="hljs-string">'ThinkPHP5開發手冊'</span>, <span class="hljs-string">'publish_time'</span> => <span class="hljs-string">'2016-03-06'</span>], ]; <span class="hljs-regexp">$user</span>->books()->saveAll(<span class="hljs-regexp">$books</span>); <span class="hljs-keyword">return</span> <span class="hljs-string">'添加Book成功'</span>; } ``` ``` ### 關聯查詢 可以直接調用模型的屬性獲取全部關聯數據,例如: ``` <pre class="calibre18"> ``` <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">read</span><span class="hljs-number">()</span></span>{ <span class="hljs-regexp">$user</span> = UserModel::get(<span class="hljs-number">1</span>); <span class="hljs-regexp">$books</span> = <span class="hljs-regexp">$user</span>->books; dump(<span class="hljs-regexp">$books</span>); } ``` ``` 一對多查詢同樣可以使用預載入查詢,例如: ``` <pre class="calibre18"> ``` <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">read</span><span class="hljs-number">()</span></span>{ <span class="hljs-regexp">$user</span> = UserModel::get(<span class="hljs-number">1</span>,<span class="hljs-string">'books'</span>); <span class="hljs-regexp">$books</span> = <span class="hljs-regexp">$user</span>->books; dump(<span class="hljs-regexp">$books</span>); } ``` ``` 一對多預載入查詢會在原先延遲查詢的基礎上增加一次查詢,可以解決典型的`N+1`次查詢問題。 如果要過濾查詢,可以調用關聯方法: ``` <pre class="calibre18"> ``` <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">read</span><span class="hljs-number">()</span></span>{ <span class="hljs-regexp">$user</span> = UserModel::get(<span class="hljs-number">1</span>); <span class="hljs-comment">// 獲取狀態為1的關聯數據</span><span class="hljs-regexp">$books</span> = <span class="hljs-regexp">$user</span>->books()->where(<span class="hljs-string">'status'</span>,<span class="hljs-number">1</span>)->select(); dump(<span class="hljs-regexp">$books</span>); <span class="hljs-comment">// 獲取作者寫的某本書</span><span class="hljs-regexp">$book</span> = <span class="hljs-regexp">$user</span>->books()->getByTitle(<span class="hljs-string">'ThinkPHP5快速入門'</span>); dump(<span class="hljs-regexp">$book</span>); } ``` ``` 還可以根據關聯數據來查詢當前模型數據,例如: ``` <pre class="calibre18"> ``` <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">read</span><span class="hljs-number">()</span></span>{ <span class="hljs-comment">// 查詢有寫過書的作者列表</span><span class="hljs-regexp">$user</span> = UserModel::has(<span class="hljs-string">'books'</span>)->select(); <span class="hljs-comment">// 查詢寫過三本書以上的作者</span><span class="hljs-regexp">$user</span> = UserModel::has(<span class="hljs-string">'books'</span>, <span class="hljs-string">'>='</span>, <span class="hljs-number">3</span>)->select(); <span class="hljs-comment">// 查詢寫過ThinkPHP5快速入門的作者</span><span class="hljs-regexp">$user</span> = UserModel::hasWhere(<span class="hljs-string">'books'</span>, [<span class="hljs-string">'title'</span> => <span class="hljs-string">'ThinkPHP5快速入門'</span>])->select(); } ``` ``` ### 關聯更新 下面來進行關聯數據的更新 ``` <pre class="calibre18"> ``` <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">update</span><span class="hljs-number">(<span class="hljs-regexp">$id</span>)</span></span>{ <span class="hljs-regexp">$user</span> = UserModel::get(<span class="hljs-regexp">$id</span>); <span class="hljs-regexp">$book</span> = <span class="hljs-regexp">$user</span>->books()->getByTitle(<span class="hljs-string">'ThinkPHP5開發手冊'</span>); <span class="hljs-regexp">$book</span>->title = <span class="hljs-string">'ThinkPHP5快速入門'</span>; <span class="hljs-regexp">$book</span>->save(); } ``` ``` 或者使用查詢構建器的`update`方法進行更新(但可能無法觸發關聯模型的事件)。 ``` <pre class="calibre18"> ``` <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">update</span><span class="hljs-number">(<span class="hljs-regexp">$id</span>)</span></span>{ <span class="hljs-regexp">$user</span> = UserModel::get(<span class="hljs-regexp">$id</span>); <span class="hljs-regexp">$user</span>->books()->where(<span class="hljs-string">'title'</span>, <span class="hljs-string">'ThinkPHP5快速入門'</span>)->update([<span class="hljs-string">'title'</span> => <span class="hljs-string">'ThinkPHP5開發手冊'</span>]); } ``` ``` ### 關聯刪除 刪除部分關聯數據: ``` <pre class="calibre18"> ``` <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">delete</span><span class="hljs-number">(<span class="hljs-regexp">$id</span>)</span></span>{ <span class="hljs-regexp">$user</span> = UserModel::get(<span class="hljs-regexp">$id</span>); <span class="hljs-comment">// 刪除部分關聯數據</span><span class="hljs-regexp">$book</span> = <span class="hljs-regexp">$user</span>->books()->getByTitle(<span class="hljs-string">'ThinkPHP5開發手冊'</span>); <span class="hljs-regexp">$book</span>->delete(); } ``` ``` 刪除所有的關聯數據: ``` <pre class="calibre18"> ``` <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">delete</span><span class="hljs-number">(<span class="hljs-regexp">$id</span>)</span></span>{ <span class="hljs-regexp">$user</span> = UserModel::get(<span class="hljs-regexp">$id</span>); <span class="hljs-keyword">if</span>(<span class="hljs-regexp">$user</span>->delete()){ <span class="hljs-comment">// 刪除所有的關聯數據</span><span class="hljs-regexp">$user</span>->books()->delete(); } } ``` ``` ## 多對多關聯 一個用戶會有多個角色,同時一個角色也會包含多個用戶,這就是一個典型的多對多關聯,先創建一個角色表`think_role`結構如下: ``` <pre class="calibre18"> ``` <span class="hljs-operator"><span class="hljs-keyword">DROP</span> <span class="hljs-keyword">TABLE</span> <span class="hljs-keyword">IF</span> <span class="hljs-keyword">EXISTS</span> <span class="hljs-string">`think_role`</span>;</span> <span class="hljs-operator"><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">TABLE</span> <span class="hljs-keyword">IF</span> <span class="hljs-keyword">NOT</span> <span class="hljs-keyword">EXISTS</span> <span class="hljs-string">`think_role`</span> ( <span class="hljs-string">`id`</span> <span class="hljs-number">int</span>(<span class="hljs-number">5</span>) <span class="hljs-keyword">UNSIGNED</span> <span class="hljs-keyword">NOT</span> <span class="hljs-number">NULL</span> AUTO_INCREMENT, <span class="hljs-string">`name`</span> <span class="hljs-number">varchar</span>(<span class="hljs-number">25</span>) <span class="hljs-keyword">NOT</span> <span class="hljs-number">NULL</span>, <span class="hljs-string">`title`</span> <span class="hljs-number">varchar</span>(<span class="hljs-number">50</span>) <span class="hljs-keyword">NOT</span> <span class="hljs-number">NULL</span>, PRIMARY <span class="hljs-keyword">KEY</span> (<span class="hljs-string">`id`</span>) ) <span class="hljs-keyword">ENGINE</span>=MyISAM <span class="hljs-keyword">DEFAULT</span> <span class="hljs-keyword">CHARSET</span>=utf8;</span> ``` ``` 多對多關聯通常一定會有一個中間表,也稱為樞紐表,所以需要創建一個用戶角色的中間表,這里創建了一個`think_access`表,結構如下: ``` <pre class="calibre18"> ``` <span class="hljs-operator"><span class="hljs-keyword">DROP</span> <span class="hljs-keyword">TABLE</span> <span class="hljs-keyword">IF</span> <span class="hljs-keyword">EXISTS</span> <span class="hljs-string">`think_access`</span>;</span> <span class="hljs-operator"><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">TABLE</span> <span class="hljs-keyword">IF</span> <span class="hljs-keyword">NOT</span> <span class="hljs-keyword">EXISTS</span> <span class="hljs-string">`think_access`</span> ( <span class="hljs-string">`user_id`</span> <span class="hljs-number">int</span>(<span class="hljs-number">6</span>) <span class="hljs-keyword">UNSIGNED</span> <span class="hljs-keyword">NOT</span> <span class="hljs-number">NULL</span>, <span class="hljs-string">`role_id`</span> <span class="hljs-number">int</span>(<span class="hljs-number">5</span>) <span class="hljs-keyword">UNSIGNED</span> <span class="hljs-keyword">NOT</span> <span class="hljs-number">NULL</span> ) <span class="hljs-keyword">ENGINE</span>=MyISAM <span class="hljs-keyword">DEFAULT</span> <span class="hljs-keyword">CHARSET</span>=utf8;</span> ``` ``` ### 關聯定義 給User模型添加多對多關聯方法定義 ``` <pre class="calibre18"> ``` <span class="hljs-operator"><span class="hljs-number"><?php</span><span class="hljs-keyword">namespace</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">model</span>; <span class="hljs-keyword">use</span> <span class="hljs-title">think</span>\<span class="hljs-title">Model</span>; <span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">User</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Model</span></span>{ <span class="hljs-comment">// 開啟自動寫入時間戳</span><span class="hljs-keyword">protected</span> <span class="hljs-regexp">$autoWriteTimestamp</span> = <span class="hljs-keyword">true</span>; <span class="hljs-comment">// 定義自動完成的屬性</span><span class="hljs-keyword">protected</span> <span class="hljs-regexp">$insert</span> = [<span class="hljs-string">'status'</span> => <span class="hljs-number">1</span>]; <span class="hljs-comment">// 定義一對一關聯</span><span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">profile</span><span class="hljs-number">()</span></span>{ <span class="hljs-keyword">return</span> <span class="hljs-regexp">$this</span>->hasOne(<span class="hljs-string">'Profile'</span>); } <span class="hljs-comment">// 定義一對多關聯</span><span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">books</span><span class="hljs-number">()</span></span>{ <span class="hljs-keyword">return</span> <span class="hljs-regexp">$this</span>->hasMany(<span class="hljs-string">'Book'</span>); } <span class="hljs-comment">// 定義多對多關聯</span><span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">roles</span><span class="hljs-number">()</span></span>{ <span class="hljs-comment">// 用戶 BELONGS_TO_MANY 角色</span><span class="hljs-keyword">return</span> <span class="hljs-regexp">$this</span>->belongsToMany(<span class="hljs-string">'Role'</span>, <span class="hljs-string">'think_access'</span>); } }</span> ``` ``` `belongsToMany`的參數如下: > #### belongsToMany('關聯模型名','中間表名稱','關聯外鍵','關聯模型主鍵','別名定義') `Role`模型定義如下: ``` <pre class="calibre18"> ``` <span class="hljs-operator"><span class="hljs-number"><?php</span><span class="hljs-keyword">namespace</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">model</span>; <span class="hljs-keyword">use</span> <span class="hljs-title">think</span>\<span class="hljs-title">Model</span>; <span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">Role</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Model</span></span>{ <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">user</span><span class="hljs-number">()</span></span>{ <span class="hljs-comment">// 角色 BELONGS_TO_MANY 用戶</span><span class="hljs-keyword">return</span> <span class="hljs-regexp">$this</span>->belongsToMany(<span class="hljs-string">'User'</span>, <span class="hljs-string">'think_access'</span>); } }</span> ``` ``` 對于樞紐表并不需要創建模型類,在多對多關聯關系中,并不需要直接操作樞紐表。 ### 關聯新增 給某個用戶增加編輯角色,并且由于這個角色還沒創建過,所以可以使用下面的方式: ``` <pre class="calibre18"> ``` <span class="hljs-comment">// 關聯新增數據</span><span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">add</span><span class="hljs-number">()</span></span>{ <span class="hljs-regexp">$user</span> = UserModel::getByNickname(<span class="hljs-string">'張三'</span>); <span class="hljs-comment">// 新增用戶角色 并自動寫入樞紐表</span><span class="hljs-regexp">$user</span>->roles()->save([<span class="hljs-string">'name'</span> => <span class="hljs-string">'editor'</span>, <span class="hljs-string">'title'</span> => <span class="hljs-string">'編輯'</span>]); <span class="hljs-keyword">return</span> <span class="hljs-string">'用戶角色新增成功'</span>; } ``` ``` 也可以批量新增用戶的角色如下: ``` <pre class="calibre18"> ``` <span class="hljs-comment">// 關聯新增數據</span><span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">add</span><span class="hljs-number">()</span></span>{ <span class="hljs-regexp">$user</span> = UserModel::getByNickname(<span class="hljs-string">'張三'</span>); <span class="hljs-comment">// 給當前用戶新增多個用戶角色</span><span class="hljs-regexp">$user</span>->roles()->saveAll([ [<span class="hljs-string">'name'</span> => <span class="hljs-string">'leader'</span>, <span class="hljs-string">'title'</span> => <span class="hljs-string">'領導'</span>], [<span class="hljs-string">'name'</span> => <span class="hljs-string">'admin'</span>, <span class="hljs-string">'title'</span> => <span class="hljs-string">'管理員'</span>], ]); <span class="hljs-keyword">return</span> <span class="hljs-string">'用戶角色新增成功'</span>; } ``` ``` 現在給另外一個用戶增加編輯角色,由于該角色已經存在了,所以只需要使用`attach`方法增加樞紐表的關聯數據: ``` <pre class="calibre18"> ``` <span class="hljs-comment">// 關聯新增數據</span><span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">add</span><span class="hljs-number">()</span></span>{ <span class="hljs-regexp">$user</span> = UserModel::getByNickname(<span class="hljs-string">'張三'</span>); <span class="hljs-regexp">$role</span> = Role::getByName(<span class="hljs-string">'editor'</span>); <span class="hljs-comment">// 添加樞紐表數據</span><span class="hljs-regexp">$user</span>->roles()->attach(<span class="hljs-regexp">$role</span>); <span class="hljs-keyword">return</span> <span class="hljs-string">'用戶角色添加成功'</span>; } ``` ``` 或者直接使用角色Id添加關聯數據 ``` <pre class="calibre18"> ``` <span class="hljs-comment">// 關聯新增數據</span><span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">add</span><span class="hljs-number">()</span></span>{ <span class="hljs-regexp">$user</span> = UserModel::getByNickname(<span class="hljs-string">'張三'</span>); <span class="hljs-regexp">$user</span>->roles()->attach(<span class="hljs-number">1</span>); <span class="hljs-keyword">return</span> <span class="hljs-string">'用戶角色添加成功'</span>; } ``` ``` ### 關聯刪除 如果需要解除用戶的管理角色,可以使用`detach`方法刪除關聯的樞紐表數據,但不會刪除關聯模型數據,例如: ``` <pre class="calibre18"> ``` <span class="hljs-comment">// 關聯刪除數據</span><span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">delete</span><span class="hljs-number">()</span></span>{ <span class="hljs-regexp">$user</span> = UserModel::get(<span class="hljs-number">2</span>); <span class="hljs-regexp">$role</span> = Role::getByName(<span class="hljs-string">'admin'</span>); <span class="hljs-comment">// 刪除關聯數據 但不刪除關聯模型數據</span><span class="hljs-regexp">$user</span>->roles()->detach(<span class="hljs-regexp">$role</span>); <span class="hljs-keyword">return</span> <span class="hljs-string">'用戶角色刪除成功'</span>; } ``` ``` 如果有必要,也可以刪除樞紐表的同時刪除關聯模型,下面的例子會解除用戶的編輯角色并且同時刪除編輯這個角色身份: ``` <pre class="calibre18"> ``` <span class="hljs-comment">// 關聯刪除數據</span><span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">delete</span><span class="hljs-number">()</span></span>{ <span class="hljs-regexp">$user</span> = UserModel::getByNickname(<span class="hljs-string">'張三'</span>); <span class="hljs-regexp">$role</span> = Role::getByName(<span class="hljs-string">'editor'</span>); <span class="hljs-comment">// 刪除關聯數據 并同時刪除關聯模型數據</span><span class="hljs-regexp">$user</span>->roles()->detach(<span class="hljs-regexp">$role</span>,<span class="hljs-keyword">true</span>); <span class="hljs-keyword">return</span> <span class="hljs-string">'用戶角色刪除成功'</span>; } ``` ``` ### 關聯查詢 獲取用戶張三的所有角色的話,直接使用: ``` <pre class="calibre18"> ``` <span class="hljs-comment">// 關聯查詢</span><span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">read</span><span class="hljs-number">()</span></span>{ <span class="hljs-regexp">$user</span> = UserModel::getByNickname(<span class="hljs-string">'張三'</span>); dump(<span class="hljs-regexp">$user</span>->roles); } ``` ``` 同樣支持對多對多關聯使用預載入查詢: ``` <pre class="calibre18"> ``` <span class="hljs-comment">// 關聯查詢</span><span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">read</span><span class="hljs-number">()</span></span>{ <span class="hljs-comment">// 預載入查詢</span><span class="hljs-regexp">$user</span> = UserModel::get(<span class="hljs-number">2</span>,<span class="hljs-string">'roles'</span>); dump(<span class="hljs-regexp">$user</span>->roles); } ``` ``` 到目前為止,我們已經掌握了關聯的基礎用法,更多的關聯使用請關注后續相關的專題。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看