Sen Using Expression Values bakmak isteyebilirsiniz
Verilen örnekte, bu gibi görünüyor (quoting the doc):
$user = new User();
$user->username = 'jwage';
$user->updated_at = new Doctrine_Expression('NOW()');
$user->save();
Ve bu SQL sorgusu oluşturur:
INSERT INTO user (username, updated_at_) VALUES ('jwage', NOW())
I Suppose it would do, in your case ?
(I don't have a Doctrine-enabled project right here, so can't test for you)
As a sidenote : I don't have a PostGreSQL server to test on ; but what you propose doesn't work on MySQL : it seems you have to use "now() + interval 2 hour
", and not "now() + interval 2 hours
" -- still, I don't know about PG
EDIT after the comment
Ergh, haklısın, bu doğru bir çözüm değildir; Bu işe yaramazsa :-(
Peki ... İlginç bir soru, bu yüzden biraz daha kazdık ve Doktrini kaynak koduna gitti; Ben ilginç bir şey bulmak olabilir düşünüyorum.
Eğer Doctrine_Query_Where::parseValue
a> kaynağının kaynağına bakarsanız, bu kod kısmını fark edeceksiniz:
// If custom sql for custom subquery
// You can specify SQL: followed by any valid sql expression
// FROM User u WHERE u.id = SQL:(select id from user where id = 1)
} elseif (substr($trimmed, 0, 4) == 'SQL:') {
$rightExpr = '(' . substr($trimmed, 4) . ')';
// simple in expression found
Ben absolutly denemedim, ama bu ilginç olabilir ...
Belki böyle bir şey yapabilirsiniz:
$reset->expires="SQL:(now() + interval $duration hours)";
If you try that, I'm very interested in knowing if it would work!
Might be useful, one day or another ;-)
BTW, o Doctrine_Search
a> de içinde kullanılan görünüyor; Bu bir bakıyor, belki de böyle, parantez olmadan çalışacağız:
$reset->expires="SQL:now() + interval $duration hours";
Seni almak için çalışıyoruz ne yapmak çok başka bir yol göremiyorum Çünkü Şey ... Ben Umut, bu kez, yardımcı olur ... (and google doesn't help me either ^^ )
EDIT after the second (third, if counting mine) comment.
I will get this working... else I won't sleep well ^^
Eh, ben (and, this time, I tested it ^^ ) bir yol bulmuş olabilir; gerçekten de bir istiyorum gibi büyük, ama, yine de güncellemeleri için değil, çalışıyor gibi görünüyor ...
Diyelim ki bu şekilde oluşturulan bir tablo var diyelim:
CREATE TABLE `test1`.`test` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(32) NOT NULL,
`value` varchar(128) NOT NULL,
`date_field` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
The corresponding model class looks like this :
Probably not perfect : it's a test-class I've written for something else, that I've mutated to fit this one ^^
class Test extends Doctrine_Record
{
public function setTableDefinition()
{
$this->setTableName('test');
$this->hasColumn('id', 'integer', 4, array(
'type' => 'integer',
'length' => 4,
'unsigned' => 0,
'primary' => true,
'autoincrement' => true,
));
$this->hasColumn('name', 'string', 32, array(
'type' => 'string',
'length' => 32,
'fixed' => false,
'notnull' => true,
));
$this->hasColumn('value', 'string', 128, array(
'type' => 'string',
'length' => 128,
'fixed' => false,
'primary' => false,
'notnull' => true,
'autoincrement' => false,
));
$this->hasColumn('date_field', 'integer', 4, array(
'type' => 'timestamp',
'notnull' => true,
));
}
}
Ben bu tabloya iki satır eklemek gerekir:
$test = new Test();
$test->name = 'Test 1';
$test->value = 'My Value 1';
$test->date_field = "2009-01-30 08:30:00";
$test->save();
$test = new Test();
$test->name = 'Test 2';
$test->value = 'My Value 2';
$test->date_field = "2009-02-05 08:30:00";
$test->save();
Which gets me this data from SQL :
BTW : I don't have a pg server, so I'll test everything with MySQL -- should work on pg too, still...
mysql> select * from test;
+----+--------+------------+---------------------+
| id | name | value | date_field |
+----+--------+------------+---------------------+
| 1 | Test 1 | My Value 1 | 2009-01-30 08:30:00 |
| 2 | Test 2 | My Value 2 | 2009-02-05 08:30:00 |
+----+--------+------------+---------------------+
2 rows in set (0.00 sec)
Yani, geçmişte uzun zaman önce tarihleri ile iki satır.
Now, to be sure, let's just fetch the line #1 :
$testBefore = Doctrine::getTable('Test')->find(1);
var_dump($testBefore->toArray());
Ben çıktı bu tür alıyorum:
array
'id' => string '1' (length=1)
'name' => string 'Test 1' (length=6)
'value' => string 'My Value 1' (length=10)
'date_field' => string '2009-01-30 08:30:00' (length=19)
And, now, the interesting part : let's update that line, using an expression like the one you provided to set the date_field
value :
$query = new Doctrine_Query();
$query->update('test')
->set('date_field', 'NOW() - interval 2 hour')
->where('id = ?', 1)
->execute();
var_dump($query->getSql());
Ben çıkış olarak almak SQL bu biridir:
string 'UPDATE test SET date_field = NOW() - interval 2 hour WHERE id = ?' (length=65)
Yanılmıyorsam eğer, hangi tür, ne istediğiniz gibi görünüyorsun ;-)
And, just to be sure, let's fetch our line once again :
$testAfter = Doctrine::getTable('Test')->find(1);
var_dump($testAfter->toArray());
Ve ben bu sonucu alırsınız:
array
'id' => string '1' (length=1)
'name' => string 'Test 1' (length=6)
'value' => string 'My Value 1' (length=10)
'date_field' => string '2009-08-04 21:26:30' (length=19)
Tarih ve saati göz önüne alındığında, bu amele gibi görünüyor - hoorray!
Ve emin olmak için, en DB doğrudan verilerini sorgulamak edelim:
mysql> select * from test;
+----+--------+------------+---------------------+
| id | name | value | date_field |
+----+--------+------------+---------------------+
| 1 | Test 1 | My Value 1 | 2009-08-04 21:26:30 |
| 2 | Test 2 | My Value 2 | 2009-02-05 08:30:00 |
+----+--------+------------+---------------------+
2 rows in set (0.00 sec)
Ve ... Yeeeepe!
Well, now, the not so good parts : to be able to use that syntax, I had to create the query "by hand", to use the set()
method, instead of doing it "nicely" with the model class and the save()
method :-(
Bu model sınıf entegre olabileceğini görmek için size kalmış artık ... Bunun eğlenin ;-)
Ve bir yol bulursanız, bir gün, sorgunun diğer bölgelerinde bu gibi ifadeler kullanmak, ya da Bir Yorum göndermek eğer daha temiz bir şekilde yapmak için, ben gerçekten (0 [{bana bildirin takdir ediyorum )]}
And, this, time, I sincerely hope I found the way ^^