ThinkPHP5雜技(一)

Thinkphp5 assign 傳遞 " 時 ,前臺收到的是 " 和ThinkPHP3.2不同,3.2收到的是 」,傳遞給js時php

用的data.replace(new RegExp('"','g'),'"')替換回來
貌似很差,獲取值的時候能夠用 {$data.abc|raw} 解決傳入參數"替換&quot問題
也就是若是前臺傳入的是json數據 後臺用 { |raw}解決

Thinkphp5.1
在部分Base.php 控制器中 \think\Request::instance()->controller()根本調用不到
須要 \think\facade\Request::instance()->controller() 能夠,

前臺url連接指向其餘控制器方法時可用
{foreach name="vo" item="val"}
    <li id="{$val.title}">
    <a href=" {:url($val.model.'/'.$val.action)}">{$val.title}</a>
    </li>
{/foreach}

  

當前臺輸出輸出數據時html

輸出的效果是git

網頁源代碼能夠看到因果github

想要的效果是thinkphp

解決方式數據庫

瀏覽器開發者工具中json

網頁源代碼中數組

 

總結:模板動態輸出含標籤的html代碼,或者雙引號時,默認輸出結果會通過htmlentities()轉義,結果不是咱們想要的,解決辦法時{XX|raw}瀏覽器

  

模板繼承的時候第二種模板標籤方式 replace="[XXX]" 不要用replace="{XXX}" 不然會意外多出 「/>

Thinkphp5.1用Model類時,return數據
在控制器dump返回的數據時顯示是一個數組————坑
array_merge()老是提示不是數組
用var_dump()打印Model返回值時發現,那是一個對象
想要Model返回array對象增長一個->toArray()

Coin::where('userid',$data)->find()->toArray();緩存

get與param區別

 

 

Thinkphp5.1遇到的坑

某兩個類似的時間戳前臺用,已提交issure,已改進 githubIssure  githubCode

輸出

一個輸出的是

有的輸出就不正確,打印出變量查看時間戳是正確的

產看緩存中的輸出

再追究

$time = 1508982277; //2017/10/26 9:44:37
var_dump(strtotime($time));
echo '<br>';
$time = 1508489607; //2017/10/20 16:53:27
var_dump(strtotime($time));

這結果!!

3.2是這麼幹的

 

模型關聯刪除問題

A hanMany B

    public function test()
    {
        $user = A::get(1);
        echo '<pre>';
        $temp = $user->products;

var_dump($temp);  //獲得的是think\model\Collection對象
var_dump($user->products()->select()); //獲得的是think\model\Collection對象,$user->products()獲得的是hasMany對象
var_dump($user->products()->where('id', 28)->find()); //獲得B對象

var_dump($user->products()->where('id', 28)->delete()); //數據庫中數據已刪除
var_dump($user->products()->select());  //id = 28 的數據已刪除
var_dump($temp); //id = 28 的數據依舊存在

}

 

object(think\model\Collection)#99 (1) {
  ["items":protected]=>
  array(3) {
    [0]=>
    object(app\user\model\ShopCar)#102 (2) {
      ["data"]=>
      array(5) {
        ["id"]=>
        int(27)
        ["產品id"]=>
        int(2)
        ["數量"]=>
        int(1)
        ["編號"]=>
        string(3) "gao"
        ["操做時間"]=>
        int(1509757081)
      }
      ["relation"]=>
      array(0) {
      }
    }
    [1]=>
    object(app\user\model\ShopCar)#101 (2) {
      ["data"]=>
      array(5) {
        ["id"]=>
        int(28)
        ["產品id"]=>
        int(5)
        ["數量"]=>
        int(1)
        ["編號"]=>
        string(3) "gao"
        ["操做時間"]=>
        int(1509757086)
      }
      ["relation"]=>
      array(0) {
      }
    }
    [2]=>
    object(app\user\model\ShopCar)#100 (2) {
      ["data"]=>
      array(5) {
        ["id"]=>
        int(29)
        ["產品id"]=>
        int(6)
        ["數量"]=>
        int(1)
        ["編號"]=>
        string(3) "gao"
        ["操做時間"]=>
        int(1509757861)
      }
      ["relation"]=>
      array(0) {
      }
    }
  }
}
object(think\model\Collection)#95 (1) {
  ["items":protected]=>
  array(3) {
    [0]=>
    object(app\user\model\ShopCar)#16 (2) {
      ["data"]=>
      array(5) {
        ["id"]=>
        int(27)
        ["產品id"]=>
        int(2)
        ["數量"]=>
        int(1)
        ["編號"]=>
        string(3) "gao"
        ["操做時間"]=>
        int(1509757081)
      }
      ["relation"]=>
      array(0) {
      }
    }
    [1]=>
    object(app\user\model\ShopCar)#96 (2) {
      ["data"]=>
      array(5) {
        ["id"]=>
        int(28)
        ["產品id"]=>
        int(5)
        ["數量"]=>
        int(1)
        ["編號"]=>
        string(3) "gao"
        ["操做時間"]=>
        int(1509757086)
      }
      ["relation"]=>
      array(0) {
      }
    }
    [2]=>
    object(app\user\model\ShopCar)#97 (2) {
      ["data"]=>
      array(5) {
        ["id"]=>
        int(29)
        ["產品id"]=>
        int(6)
        ["數量"]=>
        int(1)
        ["編號"]=>
        string(3) "gao"
        ["操做時間"]=>
        int(1509757861)
      }
      ["relation"]=>
      array(0) {
      }
    }
  }
}
object(app\user\model\ShopCar)#16 (2) {
  ["data"]=>
  array(5) {
    ["id"]=>
    int(28)
    ["產品id"]=>
    int(5)
    ["數量"]=>
    int(1)
    ["編號"]=>
    string(3) "gao"
    ["操做時間"]=>
    int(1509757086)
  }
  ["relation"]=>
  array(0) {
  }
}
int(1)
object(think\model\Collection)#87 (1) {
  ["items":protected]=>
  array(2) {
    [0]=>
    object(app\user\model\ShopCar)#90 (2) {
      ["data"]=>
      array(5) {
        ["id"]=>
        int(27)
        ["產品id"]=>
        int(2)
        ["數量"]=>
        int(1)
        ["編號"]=>
        string(3) "gao"
        ["操做時間"]=>
        int(1509757081)
      }
      ["relation"]=>
      array(0) {
      }
    }
    [1]=>
    object(app\user\model\ShopCar)#89 (2) {
      ["data"]=>
      array(5) {
        ["id"]=>
        int(29)
        ["產品id"]=>
        int(6)
        ["數量"]=>
        int(1)
        ["編號"]=>
        string(3) "gao"
        ["操做時間"]=>
        int(1509757861)
      }
      ["relation"]=>
      array(0) {
      }
    }
  }
}
object(think\model\Collection)#99 (1) {
  ["items":protected]=>
  array(3) {
    [0]=>
    object(app\user\model\ShopCar)#102 (2) {
      ["data"]=>
      array(5) {
        ["id"]=>
        int(27)
        ["產品id"]=>
        int(2)
        ["數量"]=>
        int(1)
        ["編號"]=>
        string(3) "gao"
        ["操做時間"]=>
        int(1509757081)
      }
      ["relation"]=>
      array(0) {
      }
    }
    [1]=>
    object(app\user\model\ShopCar)#101 (2) {
      ["data"]=>
      array(5) {
        ["id"]=>
        int(28)
        ["產品id"]=>
        int(5)
        ["數量"]=>
        int(1)
        ["編號"]=>
        string(3) "gao"
        ["操做時間"]=>
        int(1509757086)
      }
      ["relation"]=>
      array(0) {
      }
    }
    [2]=>
    object(app\user\model\ShopCar)#100 (2) {
      ["data"]=>
      array(5) {
        ["id"]=>
        int(29)
        ["產品id"]=>
        int(6)
        ["數量"]=>
        int(1)
        ["編號"]=>
        string(3) "gao"
        ["操做時間"]=>
        int(1509757861)
      }
      ["relation"]=>
      array(0) {
      }
    }
  }
}
View Code

 

模型能夠直接當成普通方式查詢數據,當join()後返回的再也不是模型對象,而是array數據

ShopCar::where([['a.編號', '=', $userName], ['b.狀態', '=', '使用']])->alias('a')
            ->join(['商城產品' => 'b'], 'a.產品id = b.id', 'LEFT')->column('a.產品id,a.數量,b.價格,b.pv,b.可訂購數量,b.名稱,b.重量,(b.可訂購數量-a.數量) as numLeft', 'a.id');

 

行鎖lock(true) 或者lock(false)什麼也不作 

 

ThinkPHP5.1

thinkphp\library\think\route\dispatch\Module.php P108 用到 is_callable()方法

複製代碼
        if (is_callable([$instance, $action])) {
            // 執行操做方法
            $call = [$instance, $action];
            // 自動獲取請求變量
            $vars = $this->app->config('app.url_param_type')
            ? $this->app['request']->route()
            : $this->app['request']->param();
        } elseif (is_callable([$instance, '_empty'])) {
            // 空操做
            $call = [$instance, '_empty'];
            $vars = [$actionName];
        } else {
            // 操做不存在
            throw new HttpException(404, 'method not exists:' . get_class($instance) . '->' . $action . '()');
        }

        $this->app['hook']->listen('action_begin', $call);

        return Container::getInstance()->invokeMethod($call, $vars);
    }
複製代碼

可是當 $instance中有 __call 方法時,is_callable([$instance, $action]) 返回的總爲true,須要注意,貌似Thinkphp5中反射致使的__call方法無效(我的臨時理解)

複製代碼
colin 03-Oct-2010 08:30  //代碼塊來自PHP手冊

 I haven't seen anyone note this before, but is_callable will correctly determine the existence of methods made with __call. The method_exists function will not.

 Example:
<?php

class Test {

     public function testing($not = false) {
         $not = $not ? 'true' : 'false';
         echo "testing - not: $not<br/>";
     }
     
     public function __call($name, $args) {
         if(preg_match('/^not([A-Z]\w+)$/', $name, $matches)) {
             $fn_name = strtolower($matches[1]);
             if(method_exists($this, $fn_name)) {
                 $args[] = true; // add NOT boolean to args
                 return call_user_func_array(array($this, $matches[1]), $args);
             }
         }
         die("No method with name: $name<br/>");
     }

 }

$t = new Test();
$t->testing();
$t->notTesting();

 echo "exists: ".method_exists($t, 'notTesting').'<br/>';
 echo "callable: ".is_callable(array($t, 'notTesting'));

?>

 Output:

 testing - not: false
 testing - not: true
 exists:
 callable: 1 
複製代碼

 

 Thinphp5手冊上說讓用中文表名,中文字段,沒有詳細說明

我的能夠想到的地方,

一是 pdo操做佔位符的時候沒特殊處理,

二是 中文表名得在model主動聲明我這個model對應的是哪一個表,英文代表通常可省略

三是Model返回的全是對象,字段其實是對象的屬性 ->id來調用,若是把id換成中文名稱,怪怪的,還沒見過誰的代碼真用中文作變量。雖然也能夠用 $obj['id’]查看屬性的值


支付寶驗證規則 郵箱/手機號/淘寶會員名
//        郵箱/手機號/淘寶會員名
        'aliPay|c' => 'require|length:3,25',
        'aliPay|d' => ['regex'=>'/^\w+((@\w{1,4}.\w{1,4})|(\w*))$/'],

以爲還比較理想

 

20171110

開發的項目中有這麼個需求,對數據庫中獲取的數據進行加工。3.2的時候用的在控制器中獲取數據庫,而後用控制器中的方法修改數據。如今5.1嘗試用模型的獲取器。可是發現

中的$data是一個數組,也就是不能用模型關聯中的數據。那可不行。

嘗試後用$this對象訪問即可

 

數據庫/模型 返回類型

(new AModel)->saveAll($list) 返回的是插入的條數,ep:int(1)

相關文章
相關標籤/搜索