我试图在删除之前检查表的存在.我已经阅读了Doctrine_Table的API文档,我似乎找不到这样的东西.有什么我想念的吗?
我有代码看起来像:
$table = new Doctrine_Table('model_name', $conn);
$export = new Doctrine_Export();
$export->dropTable($table->getTableName());
Run Code Online (Sandbox Code Playgroud)
当表不存在时我得到的错误是:
致命错误:未捕获异常'Doctrine_Connection_Mysql_Exception',消息'SQLSTATE [42S02]:未找到基表或视图:1051未知表
提前致谢,
卡西
在我的Symfony/Doctrine应用程序中,我有一个按RANDOM()命令的查询.我多次调用相同的方法,但看起来查询的结果正在被缓存.
这是我的相关代码:
$query = $table->createQuery('p')
->select('p.*, RANDOM() as rnd')
->orderBy('rnd')
->limit(1)
->useQueryCache(null)
->useResultCache(null);
$result = $query->fetchOne();
Run Code Online (Sandbox Code Playgroud)
不幸的是,相同的记录返回每一次,不管我的传球null
既useQueryCache
和useResultCache
.我尝试使用false
而不是null
,但这也不起作用.最后,我还打过电话既setResultCacheLifeSpan(0)
和setResultCacheLifeSpan(-1)
,但也调用了一定的作用.
有关如何防止缓存的任何见解,因为每次调用此方法时我都希望选择不同的随机行?
编辑:我也试过调用clearResultCache()
,但刚刚结束导致错误说明:"结果缓存驱动程序未初始化".
编辑2:根据要求,这是通过调用生成的SQL $query->getSqlQuery()
:
SELECT c.id AS c__id, c.name AS c__name, c.image_url AS c__image_url,
c.level AS c__level, c.created_at AS c__created_at, c.updated_at
AS c__updated_at, RANDOM() AS c__0 FROM cards c ORDER BY c__0 LIMIT 1
Run Code Online (Sandbox Code Playgroud) 我正在使用Doctrine 1.2和Symfony 1.4.假设我有一个User模型,它有一个Profile.这些定义为:
用户:
轮廓:
我通常会得到这样的数据:
$query = Doctrine_Query::create()
->select('u.id, u.username, p.first_name, p.last_name')
->from('User u')
->leftJoin('Profile p')
->where('u.username = ?', $username);
$result = $query->fetchOne(array(), Doctrine_Core::HYDRATE_ARRAY);
print_r($result);
Run Code Online (Sandbox Code Playgroud)
这将输出如下内容:
Array (
"User" => Array (
"id" => 1,
"username" => "jschmoe"
),
"Profile" => Array (
"first_name" => "Joseph",
"last_name" => "Schmoe"
)
)
Run Code Online (Sandbox Code Playgroud)
但是,我希望用户能够包含"虚拟"列(不确定这是否是正确的术语),以便Profile中的字段实际上看起来像是User的一部分.换句话说,我希望看到的print_r声明看起来更像:
Array (
"User" => Array (
"id" => 1,
"username" => "jschmoe",
"first_name" …
Run Code Online (Sandbox Code Playgroud) 如何在Doctrine 1.2 ORM的where子句中设置条件,以在DQL示例中指定大于日期
Doctrine_Query::create()
->from('user u')
->where(?)
->execute();
Run Code Online (Sandbox Code Playgroud)
谢谢
我有一个完美运行的代码Doctrine_Core::HYDRATION_ARRAY
,但崩溃了Doctrine_Core::HYDRATION_RECORD
.该页面加载大约两分钟,并显示标准的浏览器错误消息,这是类似的
Connection to the server was lost during the page load.
Run Code Online (Sandbox Code Playgroud)
(我有本地化的浏览器,所以这不是确切的错误消息,但已翻译).
使用mysql命令行Show processlist
输出
+-----+--------+-----------------+--------+---------+------+-------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+-----+--------+-----------------+--------+---------+------+-------+------------------+
| 698 | root | localhost:53899 | NULL | Query | 0 | NULL | show processlist |
| 753 | *user* | localhost:54202 | *db1* | Sleep | 102 | | NULL |
| 754 | *user* | localhost:54204 | …
Run Code Online (Sandbox Code Playgroud) Doctrine 1.2有一个名为generateModelFromDb的方法,在此记录,它为数据库中的所有表生成模型文件.
此函数接受可选的第三个参数,其中包含在生成模型时使用的"选项"数组,其详细信息未记录.我可以在这里指定哪些选项?
为什么学说(1.2)使用WHERE IN
而不是LIMIT
?
这段代码:
Doctrine_Query::create()
->from('Table t')
->limit(10)
->getSqlQuery();
Run Code Online (Sandbox Code Playgroud)
返回如下内容:
SELECT t.id_table AS t__id_table FROM table AS t WHERE t__id_table IN (1,2,3,4,10,12,18,20,21,25);
Run Code Online (Sandbox Code Playgroud)
而不是这个:
SELECT t.id_table AS t__id_table FROM table AS t LIMIT 10;
Run Code Online (Sandbox Code Playgroud)
任何LIMIT
值的这种行为都是相同的.这会为高LIMIT
值生成非常长的查询.
奖金问题:Doctrine如何知道,使用什么ID?(通过向DB发送另一个查询??)
在Doctrine 1.2中,可以为表设置键映射,其中Doctrine_Collection
由该表创建的对象将填充集合中每个记录中特定列的键.
上面链接的文档中的示例:
您可能希望映射名称列:
Run Code Online (Sandbox Code Playgroud)// test.php // ... $userTable = Doctrine_Core::getTable('User'); $userTable->setAttribute(Doctrine_Core::ATTR_COLL_KEY, 'username');
现在,用户集合将使用name列的值作为元素索引:
Run Code Online (Sandbox Code Playgroud)// test.php // ... $users = $userTable->findAll(); foreach($users as $username => $user) { echo $username . ' - ' . $user->created_at . "\n"; }
有没有办法在schema.yml文件中设置它?
(有关更好的问题,请参阅下面的编辑)如何在symfony1.4任务中使用通用Doctrine_Query::create()
创建查询来控制选择哪个连接(来自database.yml中的右侧环境部分)?
我正在使用看起来像这样的database.yml:
prod:
doctrine:
class: sfDoctrineDatabase
param:
dsn: mysql://some:pass@domain:port/database
log:
class: sfDoctrineDatabase
param:
dsn: mysql://some:pass@domain:port/database
auth:
class: sfDoctrineDatabase
param:
dsn: mysql://some:pass@domain:port/database
dev:
doctrine:
class: sfDoctrineDatabase
param:
dsn: mysql://some:otherpass@domain:port/database
log:
class: sfDoctrineDatabase
param:
dsn: mysql://some:otherpass@domain:port/database
auth:
class: sfDoctrineDatabase
param:
dsn: mysql://some:otherpass@domain:port/database
Run Code Online (Sandbox Code Playgroud)
我希望能够在调用类似以下内容时控制使用哪个数据库定义:
$query = Doctrine_Query::create()
->select('*')
->from('Products p')
->where('p.id = ?', $productID)
->limit(1);
$OfpFlPr = $query->execute()->getFirst();
Run Code Online (Sandbox Code Playgroud)
目前我无法像这样设置连接$query = Doctrine_Query::create($conn);
.
任何帮助将不胜感激!
编辑:
我在使用的软件中有很多代码Doctrine_Query::create()
(没有连接参数).它似乎通过Web请求选择了正确的环境和连接.但是我无法弄清楚它是如何做到这一点的,所以我可以使我的CLI命令以相同的方式工作(它们目前没有选择正确的连接和环境).这就是为什么我需要知道如何控制"自动"使用哪个连接(默认选中).
题:
所以我想我的结论是:
如何控制Doctrine_Query::create()
在代码作为symfony CLI命令执行时使用的较低级代码中默认选择的连接?
我为Symfony 1.4组装了一个单元测试插件,试图自动管理数据库,类似于Django测试框架的方式(在测试之间销毁和重建数据库).
在第一次测试运行之前销毁和重建数据库是有意义的,因为架构可能在开发期间发生了变化,并且让开发人员让他的测试数据库与他的模型手动同步也就是非常可悲.
然而,在第一次测试运行之后,我发现删除所有数据通常更快,这将是一个相当简单的任务,除了外键问题,这需要以正确的顺序删除数据.
对于MySQL,这不是问题; 简单地说SET FOREIGN_KEY_CHECKS = 0
,你可以破坏你心灵内容的参照完整性(SET FOREIGN_KEY_CHECKS = 1
当然,直到时间到了,但在这种情况下,没有数据可以留下,所以MySQL没有什么可抱怨的).
但只有测试数据库使用MySQL时,这才有效.对于任何其他DBMS(尤其是Sqlite),这将失败.
Doctrine 1.2是否提供了删除每个表中所有数据的方法,或者是否有"跟随"关系的方法(即,确定哪些表具有外键并首先从中删除)?
doctrine ×10
doctrine-1.2 ×10
php ×6
symfony-1.4 ×3
symfony1 ×3
caching ×1
dql ×1
foreign-keys ×1
join ×1
mysql ×1
php-5.2 ×1
schema.yml ×1