我喜欢在doctrine 2 DBAL中对数据操作查询$ conn-> insert()和$ conn-> update()的便捷方法,因为插入/更新值可以作为关联数组传递.但是我如何将NULL值,MySQL函数或其他表达式作为值传递?
例如:
/* $conn is a \Doctrine\DBAL\Connection object */
$conn->update('person', array('phone' => 'NULL'), array('id' => 1));
$conn->update('person', array('lastlogin' => 'NOW()'), array('id' => 1));
$conn->update('person', array('visit' => 'visit + 1'), array('id' => 1));
Run Code Online (Sandbox Code Playgroud)
这些函数调用会创建类似的预处理语句
UPDATE person SET phone = ? WHERE id = ?
Run Code Online (Sandbox Code Playgroud)
因此值将被视为字符串.有没有办法使用这种技术使这项工作?
我有一个新的Symfony 2.8安装,带有doctrine和MySQL 5.6堆栈.
执行完之后doctrine:schema:update --force,我可以看到
Database schema updated successfully! "x" queries were executed
这是我的问题:即使我多次执行它,学说总是会发现架构差异.
有了--dump-sql,我可以看到所有这些查询都与:
但是,当我检查我的数据库时,这些列已经有一个NOT NULL.
以下是单个属性/列的示例:
class MyEntity
{
/**
* @ORM\Id
* @ORM\Column(type="string", length=5, name="cd_key")
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $code;
...
Run Code Online (Sandbox Code Playgroud)
这是一个结果SHOW CREATE TABLE my_entity;:
CREATE TABLE `my_entity` (
`cd_key` varchar(5) COLLATE utf8_unicode_ci NOT NULL,
`label` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`number` int(11) NOT NULL,
PRIMARY KEY (`cd_key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ;
Run Code Online (Sandbox Code Playgroud)
在这里,查询原则尝试使用以下 …
我正在扩展现有的PHP应用程序.不幸的是,现有的应用程序是一团糟.这是所有带有原始mysql_*调用的意大利面条代码.呻吟.我不会在我要扩展的部分中那样做.
所以,我正在寻找一个简单的DBAL ORM,我可以很容易地进入并开始使用.所需功能:
find()或query()或任何自己.beforeSave,afterSave),则奖励积分.不是要求,但很高兴.编辑:有人让我摆脱了痛苦.我刚刚发现125K行的spaghetti代码也改变了数据库模式.例如,在某处添加一个额外的选项,一大堆ALTER TABLE语句开始飞行.我可以用这个代码库来填充一年的TheDailyWTF.所以,还有一个要求:
我一直在寻找一些解决方案,但我不确定它们在满足要求的情况下会如何运作.Doctrine 2,RedBeanPhp等都需要PHP 5.3,所以它们都出来了.有一个用于PHP 5.2.x的旧版RedBeanPhp,但我不知道它是否适用于凌乱的现有数据库模式.NotORM看起来可以用于获取数据,但我不知道它是否可以为现有数据库模式进行配置,以及如何轻松地将数据放回数据库中.
理想情况下我想要一些简单的东西.例如:
$user = User::find($id);
$user->name = 'John Woo';
$user->save();
Run Code Online (Sandbox Code Playgroud)
要么:
$articles = ORM::find('article')->where('date' => '2010-01-01');
foreach ($articles as $article) {
echo $article->name;
}
Run Code Online (Sandbox Code Playgroud)
欢迎任何提示甚至替代解决方案!
我用symfony2和doctrine用命令反向设计我的数据库:
php app/console doctrine:mapping:convert
php app/console doctrine:mapping:import
php app/console doctrine:generate:entities
Run Code Online (Sandbox Code Playgroud)
但我的字段被映射为布尔值而不是tinyint(2).
为什么它映射为布尔值?
我正在开发一个Symfony 2项目,每个用户都有自己的数据库.在我的config.yml文件中,我有一个学说:dbal:orm为客户端设置但没有连接属性,因为它们在运行时设置并由所有用户引用.即我只有一个默认的dbal连接和两个orm-connection,用户数量是无限的.
这工作正常但我需要在用户注册时创建数据库和模式(FOS UserBundle).在扩展的userbundle控制器中,我可以使用自己的逻辑.问题是我无法运行'php app/console doctrine:database:create',因为没有为新用户设置参数.
有没有办法为控制台命令指定自定义数据库参数?我可能会通过一些非常丑陋的mysql命令解决这个问题,但我宁愿不这样做.提前谢谢了!
我有一些标准,需要使用该标准基于 SELECT 创建 INSERT 查询。
查询应该是这样的:
INSERT INTO mytable (field1, field2)
SELECT f1, f2
FROM mytable2
JOIN mytable3 ON mytable3.field3 = mytable2.field2
WHERE mytable3.somefield = 'somevalue'
Run Code Online (Sandbox Code Playgroud)
编辑:
我知道如何构建 INSERT INTO VALUES 查询。但是我在 Criteria 对象中有 SELECT 的条件,我需要使用它们来构建 INSERT。
我需要这样的东西
public function myInsert(Criteria $criteria)
$qb = new QueryBuilder;
$qb->insert('mytable')
->values('field1, field2') // Is it possible
->select('f1, f2') // somthing like this?
->from('mytable2')
->innerJoin('mytable2', 'mytable3', 'mytable3',
'mytable3.field3 = mytable2.field2')
->where($criteria);
$qb->execute();
}
Run Code Online (Sandbox Code Playgroud) 以下示例显示了代码示例的一些摘录。在那里调用QueryBuilderDoctrine DBAL 两次 - 一次是为了执行一条SELECT(*)语句,另一次是在执行一条语句之前COUNT(*)。
表、条件、排序顺序和结果限制等常见设置将应用于重用QueryBuilder对象。
$queryBuilder像示例中所示的隐式重用是否有缺点?QueryBuilder?clone $queryBuilder吗?/**
* @param array $arguments
* @return string
*/
private function getOutput(array $arguments)
{
/** @var \Doctrine\DBAL\Connection $connection */
$connection = $this->getConnection();
$queryBuilder = $connection
->createQueryBuilder()
->from('some_table')
->orderBy('sorting')
->setMaxResults(100);
$condition = $queryBuilder->expr()->andX();
// ... build conditions
$queryBuilder->where($condition);
$count = $queryBuilder->select('COUNT(*)')->execute()->fetchColumn(0);
if ($count === 0) {
return 'There is nothing to show';
}
if ($count > …Run Code Online (Sandbox Code Playgroud) 是否可以使用 Doctrine DBAL 对 SQLite DB 进行批量插入?即使以下内容更加有效:
$twitter = new TwitterAPIExchange($twitterAuth);
$response = json_decode($twitter->setGetfield($getField)
->buildOauth($url, $requestMethod)
->performRequest());
foreach($response->statuses as $r) {
$statement = $app['db']->executeQuery('SELECT * FROM tweets WHERE twitter_id = ?', array($r->id));
$tweet = $statement->fetch();
if(empty($tweet)) {
$app['db']->insert('tweets', array('twitter_id'=>$r->id, 'contents' => $r->text, 'timestamp' => $r->created_at));
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用ORM创建一个querybuilder.但我偶然发现了一个与2个可能的表有关系的实体上的字段.有了这种结构,(恕我直言)就不可能将它映射到实体本身.
????????? ????????? ?????????
? ValB ? ? Main ? ? ValC ?
????????? ????????? ?????????
? *? pk ?-- + ? *? pk ? +---? *? pk ?
????????? | ????????? | ?????????
? ? ? +--? ?v_id?---+ ? ? ?
????????? ????????? ?????????
? ? ? ? ? ? ? ? ?
????????? ????????? ?????????
Run Code Online (Sandbox Code Playgroud)
可以将DBAL QueryBuilder与ORM QueryBuilder混合,或者仍然使用ORM QueryBuilder的任何其他方式主要在代码上.
PS.我没有设计数据库,我只是优化它.非常遗憾 :(
我有这个简单的例子:
$names = ['a', 'b'];
$query = $dbConnection->createQueryBuilder();
$query->select('*')
->from('foo')
->where($query->expr()->in('name', $names));
print $query->getSQL();
Run Code Online (Sandbox Code Playgroud)
输出
SELECT * FROM foo WHERE name IN (a, b)
Run Code Online (Sandbox Code Playgroud)
而不是预期的
SELECT * FROM foo WHERE name IN ('a', 'b')
Run Code Online (Sandbox Code Playgroud)
我该如何修复它?