标签: dbal

更新或插入方法中的Doctrine 2 DBAL表达式

我喜欢在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)

因此值将被视为字符串.有没有办法使用这种技术使这项工作?

php mysql doctrine doctrine-orm dbal

8
推荐指数
1
解决办法
1831
查看次数

Doctrine架构更新总是尝试添加NOT NULL

我有一个新的Symfony 2.8安装,带有doctrine和MySQL 5.6堆栈.

执行完之后doctrine:schema:update --force,我可以看到
Database schema updated successfully! "x" queries were executed

这是我的问题:即使我多次执行它,学说总是会发现架构差异.

有了--dump-sql,我可以看到所有这些查询都与:

  • 字符串主键上添加NOT NULL
  • 在datetime字段上添加NOT NULL

但是,当我检查我的数据库时,这些列已经有一个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)

在这里,查询原则尝试使用以下 …

mysql symfony doctrine-orm dbal

8
推荐指数
1
解决办法
1121
查看次数

对于现有的PHP应用程序,需要一个简单的ORM或DBAL

我正在扩展现有的PHP应用程序.不幸的是,现有的应用程序是一团糟.这是所有带有原始mysql_*调用的意大利面条代码.呻吟.我不会在我要扩展的部分中那样做.

所以,我正在寻找一个简单的DBAL ORM,我可以很容易地进入并开始使用.所需功能:

  • 它必须适用于现有的数据库架构.优选地,具有最少的或没有额外的配 现有的数据库模式与现有的PHP代码质量相同(没有合理的命名约定,没有规范化等).我不想花费数天时间将数据库模式手动转换为带注释的对象属性,即教条2.
  • 它必须能够与现有的原始mysql_*查询一起工作.当脚本手动操作数据库背后的数据时,我不知道像Doctrine 2或Propel这样的ORM如何表现,但我认为它并不漂亮.
  • 它必须在PHP 5.2.x上运行.我很喜欢使用PHP 5.3,但我有打算在现有的125K线面条代码混乱,以确保它运行在PHP 5.3零利率.
  • 不需要关系.在少数地方,我需要去的关系数据,我会很高兴地调用额外的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)

欢迎任何提示甚至替代解决方案!

php orm dbal notorm

6
推荐指数
1
解决办法
4216
查看次数

mysql tinyint(2)映射为boolean与doctrine不正确

我用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).

为什么它映射为布尔值?

doctrine tinyint symfony dbal doctrine-dbal

6
推荐指数
1
解决办法
6132
查看次数

Symfony 2 Console命令用于创建自定义数据库

我正在开发一个Symfony 2项目,每个用户都有自己的数据库.在我的config.yml文件中,我有一个学说:dbal:orm为客户端设置但没有连接属性,因为它们在运行时设置并由所有用户引用.即我只有一个默认的dbal连接和两个orm-connection,用户数量是无限的.

这工作正常但我需要在用户注册时创建数据库和模式(FOS UserBundle).在扩展的userbundle控制器中,我可以使用自己的逻辑.问题是我无法运行'php app/console doctrine:database:create',因为没有为新用户设置参数.

有没有办法为控制台命令指定自定义数据库参数?我可能会通过一些非常丑陋的mysql命令解决这个问题,但我宁愿不这样做.提前谢谢了!

mysql console doctrine symfony dbal

6
推荐指数
1
解决办法
1905
查看次数

是否可以使用 Doctrine QueryBuilder 构建 INSERT INTO SELECT 查询?

我有一些标准,需要使用该标准基于 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)

php mysql symfony doctrine-orm dbal

6
推荐指数
1
解决办法
2918
查看次数

在 Doctrine DBAL 中重用 QueryBuilder

以下示例显示了代码示例的一些摘录。在那里调用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)

php doctrine dbal

6
推荐指数
1
解决办法
3162
查看次数

Doctrine DBAL可以批量插入吗?

是否可以使用 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)

php doctrine dbal

5
推荐指数
1
解决办法
2700
查看次数

可以将Doctrine DBAL与ORM查询生成器混合使用吗?

我正在尝试使用ORM创建一个querybuilder.但我偶然发现了一个与2个可能的表有关系的实体上的字段.有了这种结构,(恕我直言)就不可能将它映射到实体本身.

?????????      ?????????       ?????????
? ValB  ?      ? Main  ?       ? ValC  ?
?????????      ?????????       ?????????
? *? pk ?-- +  ? *? pk ?   +---? *? pk ?
?????????   |  ?????????   |   ?????????
?  ?    ?   +--?  ?v_id?---+   ?  ?    ?
?????????      ?????????       ?????????
?  ?    ?      ?  ?    ?       ?  ?    ?
?????????      ?????????       ?????????
Run Code Online (Sandbox Code Playgroud)

可以将DBAL QueryBuilder与ORM QueryBuilder混合,或者仍然使用ORM QueryBuilder的任何其他方式主要在代码上.

PS.我没有设计数据库,我只是优化它.非常遗憾 :(

php orm symfony doctrine-orm dbal

5
推荐指数
1
解决办法
383
查看次数

DBAL 查询生成器为 IN 子句创建的表达式未将值设置为字符串?

我有这个简单的例子:

$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)

我该如何修复它?

php sql doctrine dbal

5
推荐指数
1
解决办法
2192
查看次数

标签 统计

dbal ×10

php ×7

doctrine ×6

symfony ×5

doctrine-orm ×4

mysql ×4

orm ×2

console ×1

doctrine-dbal ×1

notorm ×1

sql ×1

tinyint ×1