假设我有与B有关的模型A.
我写的时候:
$a = A::model()->findByPK(1);
$a->B->doSomething();
Run Code Online (Sandbox Code Playgroud)
现在B可以改变(例如由其他用户改变).我写的时候:
$a->B->doSomething();
Run Code Online (Sandbox Code Playgroud)
它使用B的旧值.在doSomething()之前,我应该强制刷新B的值.
首先,我只想说我正在使用PHP框架Yii,所以如果可能的话,我希望保持在其定义的SQL语句集中.我知道我可能会创建一个可以做任何事情的巨大的长SQL语句,但我宁愿不去那里.
好吧,想象一下我有一个表用户和一个表FavColors.然后我有一个表单,用户可以通过从大量可能的颜色列表中选中一个或多个复选框来选择颜色首选项.
这些结果在FavColors表中存储为多行,如(id,user_id,color_id).
现在想象用户进入并改变他们的颜色偏好.在这种情况下,将新颜色首选项放入数据库的最有效方法是什么?
选项1:
选项2:
我喜欢选项一,因为它只需要两个语句,但是删除一行只是为了可能放回几乎完全相同的数据而感到错误.还有一个问题是让id更快地自动递增到更高的值,并且我不知道是否应该尽可能避免这种情况.
选项2将需要更多的编程工作,但是会阻止我只是为了再次创建它而删除一行的情况.但是,在PHP中添加更多负载可能不值得减少MySQL的负载.
有什么想法吗?你们都会做什么?
我们将从自制框架切换到Symfony或Yii.从我们的观点来看,这两个框架的能力是相似的(即它们都有我们需要的东西).
我们的情况:php 5.2.9,中型网站(10.000唯一身份/天)但共享主机.
请不要回答"这个更好",最好是最近会使用这两个框架的人.
有人能告诉我如何在yii中使用jquery-datepicker作为日期范围吗?我让它工作一个日期如何修改它以获得多个日期.我是yii框架的新手.
注意那个ANYTHING_ELSE所以,我有我的控制器和动作,我想像往常一样响应这样的例子:
// for UserContoller with actionList and actionEdit
user/list
user/edit/25
Run Code Online (Sandbox Code Playgroud)
但对于不属于特定控制器和操作的所有内容,我希望它们属于一个默认控制器和操作,如:BlogController和actionView.这就是ANYTHING_ELSE的来源.
// ANYTHING_ELSE can be:
this-is-a-test-page
this/is/another/page/with/lots/of/slashes
this-has-extension.html
'urlManager' => array(
'urlFormat' => 'path',
'showScriptName' => false,
'rules' => array(
'<controller:\w+>/<id:\d+>' => '<controller>/view',
'<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
'<controller:\w+>/<action:\w+>' => '<controller>/<action>',
'ANYTHING_ELSE' => 'blog/view',
),
),
Run Code Online (Sandbox Code Playgroud) 当yii中的下拉列表更改时,我会渲染一些表单元素,如下所示:
$form->dropdownListRow($model, 'type', array('item1','item2','etc') ,
array('ajax'=>array(
'type'=>'POST',
'url'=>CController::createUrl('ProfileFieldRule/showAttributes'),
'update'=>'#showAttributes',
))
));
Run Code Online (Sandbox Code Playgroud)
ProfileFieldRule/showAttributes使用CHtml渲染表单元素,这导致了我的第一个问题 - 我必须使用opentag等,并重复在表单中完成的工作.
echo CHtml::openTag('div', array('class' => 'control-group '));
echo CHtml::activeLabel($attr, $name, array('class' => 'control-label'));
etc
Run Code Online (Sandbox Code Playgroud)
第二个问题是:如果没有更改事件(例如提交的表单有错误),则不会加载动态内容.
我正在传递模型并检查它是否为null,否则执行与ProfileFieldRule/showAttributes相同的渲染,例如:
<div id="showAttributes">
<?php if (isset($attr)) {
//do the same rendering as in showAttributes
$vars = get_class_vars(get_class($attr));
foreach ($vars as $name => $value) {
//etc...
?>
</div>
Run Code Online (Sandbox Code Playgroud)
如果我可以调用上面的代码onload,onchange,并且仍然可以访问$ form,那将是理想的选择.
我对任何事情持开放态度,那么如上所述,显示和保持动态内容的最佳(或好)解决方案是什么?
提前感谢任何建议.
这是一个正在发生的事情的图像http://imgur.com/cZjRZ 注意,渲染的元素没有显示ajax验证(以红色/绿色突出显示),因为我对ajax很不好并且还在计算
我应该注意,我考虑的另一个解决方案是摆脱showAttributes,继续将两个模型传递给表单,并在更改时再次调用create action.然而,当更改下拉列表时,这会删除之前的ajax验证,因为整个表单被重绘.
如何使用浮点数添加条件?
我尝试了很多.
这样可行:
$criteria=new CDbCriteria();
$criteria->addInCondition('order_id',array(36907));
$tasks=OrderTask::model()->findAll($criteria);
Run Code Online (Sandbox Code Playgroud)
在我的情况下,它返回4个模型:

但是,如果我尝试
$criteria=new CDbCriteria();
$criteria->addInCondition('order_id',array(36907));
$criteria->addInCondition('step',array(3.20));
$tasks=OrderTask::model()->findAll($criteria);
Run Code Online (Sandbox Code Playgroud)
要么
$criteria=new CDbCriteria();
$criteria->addInCondition('step',array("3.20"));
$tasks=OrderTask::model()->findAll($criteria);
Run Code Online (Sandbox Code Playgroud)
要么
$criteria=new CDbCriteria();
$criteria->addInCondition('step',array('3.2'));
$tasks=OrderTask::model()->findAll($criteria);
Run Code Online (Sandbox Code Playgroud)
结果是空的.
根据日志,查询是:
system.db.CDbCommand.query(SELECT*FROM
orders_taskstWHERE step =:ycp1.绑定:ycp1 = 3.2)
phpmyadmin中的此查询返回5360行
SELECT * FROM `orders_tasks` `t` WHERE step = 3.20
Run Code Online (Sandbox Code Playgroud)
phpmyadmin中的此查询返回0行
SELECT * FROM `orders_tasks` `t` WHERE step = '3.20'
SELECT * FROM `orders_tasks` `t` WHERE step = '3.2'
SELECT * FROM `orders_tasks` `t` WHERE step = "3.20"
Run Code Online (Sandbox Code Playgroud)
这试试
$criteria=new CDbCriteria();
$criteria->addInCondition('step',array("3,20"));
$tasks=OrderTask::model()->findAll($criteria);
Run Code Online (Sandbox Code Playgroud)
返回步长= 3或20的模型
phpmyadmin中的此查询返回step …
我和Yii开发了一个项目.
我需要一个简单的.php文件(不是组件,不是类,只是PHP函数定义的常规序列).在Yii框架下执行此操作的正确方法是什么?我应该使用普通的require_once()吗?
require_once(Yii::app()->basePath . '/extensions/my-php-file.php');
对?
好的,我正在使用Yii2,我熟悉使用mysql查询时准备/绑定数据,例如:
$sql = $this->db->createCommand("UPDATE some_table SET something='foo' WHERE some_id=:some_id");
$sql->bindValue(':some_id', $some_id);
Run Code Online (Sandbox Code Playgroud)
但是,当值可能包含多个值时,例如何时使用MySQL语法IN?
例如:
$sql = $this->db->createCommand("UPDATE some_table SET something='foo' WHERE some_id IN (:parents)");
$sql->bindValue(':parents', $parents);
Run Code Online (Sandbox Code Playgroud)
现在据我所知,如果$parentsvar只有一个值,那么上面只会很好用; 但如果它有多个值,例如1,2,3,那么你最终会喜欢的东西'1,2,3',当你真的想要'1','2','3'OR 1,2,3.
这样做的正确方法是什么?
我在一个子目录上部署了yii2.我在重定向上遇到问题.在我的localhost上,我的项目不在子目录中,所以我没有任何问题.但是当我将它部署在我们的实时服务器上并将项目放在子目录中时,我遇到了问题.
我的问题是,当我访问我网站的主页时,我被重定向到网站的根目录.
以下是一个示例:主站点:http://example.com/
Yii2网站:http://example.com/myproject/
当我尝试访问http://example.com/myproject/时,我希望在http://example.com/myproject/login上重定向,而不是重定向到http://example.com/login.
我已经将我的.htaccess改成了这个
RewriteEngine on
# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# otherwise forward it to index.php
RewriteRule ^(.*) system/index.php/$1 [QSA,L]
Run Code Online (Sandbox Code Playgroud)
但我认为这个错误虽然......
我的web.php上也有这个
$config = [
'id' => 'basic',
'basePath' => dirname(__FILE__) . DIRECTORY_SEPARATOR . '..',
'defaultRoute' => 'site/login',
//... other codes here...
Run Code Online (Sandbox Code Playgroud)
正如你可以看到我有一个defaultRoute是site/login但似乎我一直在重定向的/login,这是不是在一个子文件夹的链接.
任何帮助如何在子目录中设置yii2
对你的帮助表示感谢.谢谢!