Yii::app()->controller->id
请问这个在yii2 里面该怎么用呢?
Yii::$app->controller->id
Yii::$app你打印这个看看,里面有没有controller和action的
Yii::app()->controller->id
请问这个在yii2 里面该怎么用呢?
Yii::$app->controller->id
Yii::$app你打印这个看看,里面有没有controller和action的
use app\models\Article;
$test1 = Article::find()->where($map)->asArray()->one();
$test2 = Article::find()->where($map)->one();
$test3 = $test2->title;
其中$test2的过程会比$test1过程多一条“SHOW”查询,$test3多两条。
我是想把关联表的查询封装到一个模型内,没有封装时候调试工具显示只有5条查询,一旦将另一个模型封装在当前模型, 就变成了9条。
虽然看起来耗时很短,想问一下这个”show”语句的影响。
一个尝试性的封装,下面的只是一个例子,方式如下:
//文章表如下所示,还有个内容表,内容在内容表的"Content"字段中
namespace api\models;
use sys\core\base\BaseActiveRecord;
class Article extends BaseActiveRecord {
private $_content = null; //表单"content",私有属性:文章内容。
/***********************************此处省略x行代码***********************************************/
//用于获取文章内容
public function getContent() {
if ($this->isNewRecord) {
return null;
} else {
return $this->_content == null ? ArticleContent::findOne($this->content_id)->content : $this->_content;
}
}
调用如下所示:
$articleModel= Article::find()->where($sql)->one();
$articleContent=$articleModel->content;//由于对象$articleModel没有content,会自动调用getContent()方法,就和访问自己的属性一样了
上面这种方式获取文章内容会多出:
SHOW CREATE TABLE `frontend_article_content`
SHOW CREATE TABLE `frontend_article`
SHOW FULL COLUMNS FROM `frontend_article_content`
SHOW FULL COLUMNS FROM `frontend_article`
你看我如果用下面的方式获取文章内容就不会出现”show”语句:
$articleModel= Article::find()->where($sql)->asArray()->one();
$content = ArticleContent::find()->where(['id' => $articleModel['content_id']])->asArray()->one();
但是却少了一些便利性,一定程度上也不能安全的保护数据,毕竟是关联模型。
数据库配置中开启表结构缓存 就没了。
楼上回答的很清楚了,赞一个
楼上回答的很清楚了,赞一个
最近一直用2.0.4进行开发,在开发的过程中发现一个简单的页面,debuger显示的time居然要1600ms。该页面只是连了数据库读取了一个表的数据并显示出来而已。你们用yii2开发的app也是要加载那么久吗?
查看log里面耗时最久的就是渲染view了
21 17:23:14.396 trace yii\base\View::renderFile Rendering view file:
22 17:23:15.051 trace yii\base\View::renderFile Rendering view file:
占了 600多ms
最后自己研究出来了,使用Yii2 必须开启opcache,开启和没有开启真心差好远。php5.5自带的 php5.4请自行安装
开发环境和生产环境差别比较大,没办法一起比较,我测试过,开发环境光加载debugger和gii相关内容就要消耗很多时间
我觉得电脑该时刻是不是内存已经用了很多了,我出现这种情况,time会很快上升,但是关掉几个软件之后又正常了。
Database Queries你的是多少次
我的13次,6个asset绑定,达到300ms
第一次打开比较慢,第二次就比较快了,因为第二次有缓存了。
貌似yii的视图加载是硬伤,没有页面缓存的情况下或者第一次加载时都会比较慢,因为yii的视图渲染差不多就是require_once来加载的嵌套
<fieldset>
<form class="subscriptionForm" method="post">
<input id="subscriptionForm" class="inputForm" type="text" value="Enter Your Email Address" onFocus="if (this.value=='Enter Your Email Address') this.value=''" onBlur="if (this.value==''){this.value='Enter Your Email Address'}" />
<input type="submit" id="submitButton" class="transition" value="Send">
</form>
</fieldset>
最好是上传一张图片为最佳
资源包里的js文件都是加载在尾部的,启用了layout。这样我在view里直接写javascript就在出现在引入其他js文件前面,导致无效,用registerJs格式又不好整,求办法!
想加载在头部,给你个例子,注意$jsOptions
那就用registerJsFile
官方文档没怎么看懂……
如果你在class Order里定义了一个class Customer的关联(如order表里有一个customer_id的字段),在创建Order记录的时候,可能会有类似这样的执行:
如果在Order类里定义过外键关联(如下),那就可以通过link方法用面向对象的方式来给customer_id赋值:
之前创建Order对象的语句就变成:
这里link的作用只是将外键的值填到对应字段,但如果外键关联是通过中间表来实现的,那link会自动创建中间表记录。比如
有order表,item表,order_item表来存储order和item的关联。参考Relations via a Junction Table
如果在Order类里定义过外键关联如下:
那就可以通过link方法来关联Item对象:
order_item表中会自动创建一条order_id为$order->id, item_id为$item->id的记录
外键关联的,则会在外键赋值后会自动保存数据
大家好,测试了一天,实际收效甚微。
具体controller如下。
public function actionCreate() {
$session = Yii::$app->session;
$sessionKey = Yii::$app->user->id . '.issending';
Yii::warning(isset($session[$sessionKey]));
if (!isset($session[$sessionKey])) {
$session[$sessionKey] = microtime();
Yii::warning($session[$sessionKey]);
$model = new book();
$model->load(Yii::$app->request->post());
if ($model->save()) {
\Yii::$app->getSession()->setFlash('info', '新增完成');
} else {
\Yii::$app->getSession()->setFlash('error', '新增失败');
}
}
unset($session[$sessionKey]);
$this->redirect(['index']);
}
作用是来防止段时间内重复提交的。
但是在我在前台 快速双击 提交按钮后,依然会产生2(或实际点击次数)条一样的数据
日志文件中 因为 Yii::warning(isset($session[$sessionKey]));
查产生的内容 全部为false。
客户端的js屏蔽按钮,已经实现(本测试中取消了屏蔽用来模拟客户端屏蔽js的情况)。
model部分unique的规则也已实现。(本测试中取消了unique规则,模拟实际上确实容许重复的情况)
不知道大家是否有什么好的方法,来避免重复提交。
谢谢大家。
可能的原因是unset($session[$sessionKey]);
在你的第二次POST请求到达之前就执行了,所以session机制不好使。如果在不用unique规则、不用table的key冲突、也不用js屏蔽button的前提下,想在服务器端避免重复insert,可以在book中重载ActiveRecord的beforeSave方法,在里面查重,根据情况返回true/false。
表示我也遇到这中问题
如何将默认生成的curd显示的列表页改成分页式的啊,求一个例子
本来就是分页式的啊 肯定是你数据不够、、、
我在做一个图片多图片上传的功能 图片能上传成功 ,也能在视图页面正常显示。但是在二次修改的时候,一提交就没了 原因是在二次修改的表单里 你如果不选择图片 fileInput 表单里是空的所以就把数据库里的图片路径更新成空的了,我现在想到的解决办法是 (在二次修改的时候把原来已经上传的图片的路径显示在 fileInput 表单里,这样就可以避免了)
fileinput
是个例外,无论insert
操作还是update
,正常情况在表单中选择文件的地方是清空的,可能是w3c的定义。你也可以在接收POST数据之前
保存文件路径的字段的值,接收post数据之后
如果发现浏览器没有新文件upload,那么save
之前还原你之前保存的值即可。
你的方法也可以,有个负面影响就是用户体验会下降一些,和正常的文件上传表单感觉不一样。
骚年你确定你修改的model是findOne出来的而不是直接new出来的?
如果你在上传成功后添加数据库,那么插入库的时候没有把图片地址插库?
如果你的图片路径指的是本地路径的话,这样是行不通的,因为我记得OSX或者Linux系统是没办法获取这个路径的。
我的解决方案:
大家好,请问, 使用AR updateAll
是不是 不会触发 afterUpdate
等事件?
类似的内容 请问哪里查看? 代码中是否可以 在使用 updateAll
之后 手工触发 afterUpdate
事件?
updateAll()
只返回受影响的行数,那个行数在一个事件里能玩出什么名堂呢?所以afterUpdate对于updateAll来说没有任何意义。你想干什么,就在调用updateAll()
之后调用一个函数就好了,或者触发一个自定义的事件。
比较update()和updateAll()的区别。或者看这两个函数的框架源码。updateAll
不能触发 afterUpdate
可以自己注册事件,然后emit
afterUpdateAll 这个来触发