<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>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # 視圖模型 [上一頁](# "上一頁")[下一頁](# "下一頁") ### 視圖定義 視圖通常是指數據庫的視圖,視圖是一個虛擬表,其內容由查詢定義。同真實的表一樣,視圖包含一系列帶有名稱的列和行數據。但是,視圖并不在數據庫中以存儲的數據值集形式存在。行和列數據來自由定義視圖的查詢所引用的表,并且在引用視圖時動態生成。對其中所引用的基礎表來說,視圖的作用類似于篩選。定義視圖的篩選可以來自當前或其它數據庫的一個或多個表,或者其它視圖。分布式查詢也可用于定義使用多個異類源數據的視圖。如果有幾臺不同的服務器分別存儲組織中不同地區的數據,而您需要將這些服務器上相似結構的數據組合起來,這種方式就很有用。視圖在有些數據庫下面并不被支持,但是ThinkPHP模擬實現了數據庫的視圖,該功能可以用于多表聯合查詢。非常適合解決HAS_ONE 和 BELONGS_TO 類型的關聯查詢。 要定義視圖模型,只需要繼承Think\Model\ViewModel,然后設置viewFields屬性即可。 例如下面的例子,我們定義了一個BlogView模型對象,其中包括了Blog模型的id、name、title和User模型的name,以及Category模型的title字段,我們通過創建BlogView模型來快速讀取一個包含了User名稱和類別名稱的Blog記錄(集)。 ~~~ namespace Home\Model; use Think\Model\ViewModel; class BlogViewModel extends ViewModel { public $viewFields = array( 'Blog'=>array('id','name','title'), 'Category'=>array('title'=>'category_name', '_on'=>'Blog.category_id=Category.id'), 'User'=>array('name'=>'username', '_on'=>'Blog.user_id=User.id'), ); } ~~~ 我們來解釋一下定義的格式代表了什么。 `$viewFields` 屬性表示視圖模型包含的字段,每個元素定義了某個數據表或者模型的字段。 例如: ~~~ 'Blog'=>array('id','name','title'); ~~~ 表示BlogView視圖模型要包含Blog模型中的id、name和title字段屬性,這個其實很容易理解,就和數據庫的視圖要包含某個數據表的字段一樣。而Blog相當于是給Blog模型對應的數據表定義了一個別名。 默認情況下會根據定義的名稱自動獲取表名,如果希望指定數據表,可以使用: ~~~ '_table'=>"test_user" // 3.2.2版本以上還可以使用簡化定義(自動獲取表前綴) '_table'=>"__USER__" ~~~ 如果希望給當前數據表定義另外的別名,可以使用 ~~~ '_as'=>'myBlog' ~~~ BlogView視圖模式除了包含Blog模型之外,還包含了Category和User模型,下面的定義: ~~~ 'Category'=>array('title'=>'category_name'); ~~~ 和上面類似,表示BlogView視圖模型還要包含Category模型的title字段,因為視圖模型里面已經存在了一個title字段,所以我們通過 ~~~ 'title'=>'category_name' ~~~ 把Category模型的title字段映射為`category_name`字段,如果有多個字段,可以使用同樣的方式添加。 可以通過_on來給視圖模型定義關聯查詢條件,例如: ~~~ '_on'=>'Blog.category_id=Category.id' ~~~ 理解之后,User模型的定義方式同樣也就很容易理解了。 ~~~ Blog.categoryId=Category.id AND Blog.userId=User.id ~~~ 最后,我們把視圖模型的定義翻譯成SQL語句就更加容易理解視圖模型的原理了。假設我們不帶任何其他條件查詢全部的字段,那么查詢的SQL語句就是 ~~~ Select Blog.id as id, Blog.name as name, Blog.title as title, Category.title as category_name, User.name as username from think_blog Blog JOIN think_category Category JOIN think_user User where Blog.category_id=Category.id AND Blog.user_id=User.id ~~~ 視圖模型的定義并不需要先單獨定義其中的模型類,系統會默認按照系統的規則進行數據表的定位。如果Blog模型并沒有定義,那么系統會自動根據當前模型的表前綴和后綴來自動獲取對應的數據表。也就是說,如果我們并沒有定義Blog模型類,那么上面的定義后,系統在進行視圖模型的操作的時候會根據Blog這個名稱和當前的表前綴設置(假設為Think_ )獲取到對應的數據表可能是think_blog。 ThinkPHP還可以支持視圖模型的JOIN類型定義,我們可以把上面的視圖定義改成: ~~~ public $viewFields = array( 'Blog'=>array('id','name','title','_type'=>'LEFT'), 'Category'=>array('title'=>'category_name','_on'=>'Category.id=Blog.category_id','_type'=>'RIGHT'), 'User'=>array('name'=>'username','_on'=>'User.id=Blog.user_id'), ); ~~~ 需要注意的是,這里的_type定義對下一個表有效,因此要注意視圖模型的定義順序。Blog模型的 ~~~ '_type'=>'LEFT' ~~~ 針對的是下一個模型Category而言,通過上面的定義,我們在查詢的時候最終生成的SQL語句就變成: ~~~ Select Blog.id as id, Blog.name as name, Blog.title as title, Category.title as category_name, User.name as username from think_blog Blog LEFT JOIN think_category Category ON Blog.category_id=Category.id RIGHT JOIN think_user User ON Blog.user_id=User.id ~~~ 我們可以在試圖模型里面定義特殊的字段,例如下面的例子定義了一個統計字段 ~~~ 'Category'=>array('title'=>'category_name','COUNT(Blog.id)'=>'count','_on'=>'Category.id=Blog.category_id'), ~~~ ### 視圖查詢 接下來,我們就可以和使用普通模型一樣對視圖模型進行操作了 。 ~~~ $Model = D("BlogView"); $Model->field('id,name,title,category_name,username')->where('id>10')->order('id desc')->select(); ~~~ 看起來和普通的模型操作并沒有什么大的區別,可以和使用普通模型一樣進行查詢。如果發現查詢的結果存在重復數據,還可以使用group方法來處理。 ~~~ $Model->field('id,name,title,category_name,username')->order('id desc')->group('id')->select(); ~~~ 我們可以看到,即使不定義視圖模型,其實我們也可以通過方法來操作,但是顯然非常繁瑣。 ~~~ $Model = D("Blog"); $Model->table('think_blog Blog,think_category Category,think_user User') ->field('Blog.id,Blog.name,Blog.title,Category.title as category_name,User.name as username') ->order('Blog.id desc') ->where('Blog.category_id=Category.id AND Blog.user_id=User.id') ->select(); ~~~ 而定義了視圖模型之后,所有的字段會進行自動處理,添加表別名和字段別名,從而簡化了原來視圖的復雜查詢。如果不使用視圖模型,也可以用連貫操作的JOIN方法實現相同的功能。 [上一頁](# "上一頁")[下一頁](# "下一頁")
                  <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>

                              哎呀哎呀视频在线观看