كيف يمكنني إرسال معلمة حرفية عبر عقيدة إلى DB؟

StackOverflow https://stackoverflow.com/questions/1229118

  •  22-07-2019
  •  | 
  •  

سؤال

إذا أردت أن أفعل شيئًا كهذا (لاحظ خط انتهاء الصلاحية):

$duration=24; //in hours

$reset=new PasswordReset();
$reset->code=md5(uniqid());
$reset->expires="now() + interval $duration hours";
$reset->User=$user;
$reset->save();

كيف يمكنني الحصول على عقيدة لعدم الاقتباس قبل إرسالها إلى PostgreSQL؟ أعلم أنه يمكنني القيام بذلك في PHP ، لكنني أود أن أعرف للرجوع إليه في المستقبل.

هل كانت مفيدة؟

المحلول

قد ترغب في إلقاء نظرة على باستخدام قيم التعبير

المثال المحدد يبدو هكذا (نقلاً عن المستند) :

$user = new User();
$user->username = 'jwage';
$user->updated_at = new Doctrine_Expression('NOW()');
$user->save();

ويولد استعلام SQL هذا:

INSERT INTO user (username, updated_at_) VALUES ('jwage', NOW())

أفترض أن ذلك سيفعل ، في حالتك؟
(ليس لدي مشروع يدعم المذهب هنا ، لذلك لا يمكنني اختبارك)


بصفتي SideNote: ليس لدي خادم postgresql لاختباره ؛ لكن ما تقترحه لا يعمل على MySQL: يبدو أن عليك استخدام "now() + interval 2 hour"، و لا "now() + interval 2 hours" - ومع ذلك ، لا أعرف عن PG


تحرير بعد التعليق

Ergh ، أنت على حق ، هذا ليس حلاً صحيحًا ؛ لا يعمل :-(

حسنًا ... سؤال مثير للاهتمام ، لذلك حفرت أكثر قليلاً ، وذهبت إلى رمز مصدر العقيدة ؛ أعتقد أنني قد أجد شيئًا مثيرًا للاهتمام.

إذا نظرت إلى مصدر Doctrine_Query_Where::parseValue المصدر ، ستلاحظ هذا الجزء من الكود:

// 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

لم أحاول تمامًا ، لكن هذا قد يكون مثيرًا للاهتمام ...

ربما يمكنك أن تفعل شيئًا كهذا:

$reset->expires="SQL:(now() + interval $duration hours)";

إذا حاولت ذلك ، فأنا مهتم جدًا بمعرفة ما إذا كان سيعمل!
قد تكون مفيدة ، يوم واحد أو آخر ؛-)

راجع للشغل ، يبدو أنه يستخدم في Doctrine_Search جدا ؛ بالنظر إلى هذا ، ربما ستعمل بدون أقواس ، مثل هذا:

$reset->expires="SQL:now() + interval $duration hours";

حسنًا ... آمل ، هذه المرة ، يساعد ... لأنني لا أرى طريقة أخرى لفعل ما تحاول الحصول عليه (و Google لا يساعدني أيضًا ^ ^)


تحرير بعد التعليق الثاني (الثالث ، إذا عد لي).
سأحصل على هذا العمل ... وإلا لن أنام جيدًا ^ ^

حسنًا ، ربما وجدت طريقة (وهذه المرة ، اختبرته ^ ^) ؛ ليس حقًا رائعًا كما يود المرء ، ولكن بالنسبة للتحديثات على أي حال ، يبدو أنه يعمل ...

لنفترض أن لدي طاولة تم إنشاؤها بهذه الطريقة:

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;

تبدو فئة النموذج المقابلة هكذا:
ربما ليست مثالية: إنها فئة اختبار كتبت لشيء آخر ، لقد تحورت لتناسب هذا ^ ^

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,
             ));
    }
}

سأدخل سطرين في هذا الجدول:

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

الذي يجعلني هذه البيانات من SQL:
راجع للشغل: ليس لدي خادم PG ، لذلك سأختبر كل شيء باستخدام MySQL - يجب أن أعمل على PG أيضًا ، لا يزال ...

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)

لذلك ، سطرين ، مع تواريخ منذ فترة طويلة في الماضي.


الآن ، بالتأكيد ، دعنا فقط جلب الخط رقم 1:

$testBefore = Doctrine::getTable('Test')->find(1);
var_dump($testBefore->toArray());

أحصل على هذا النوع من الإخراج:

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)


والآن ، الجزء المثير للاهتمام: دعنا نقوم بتحديث هذا السطر ، باستخدام تعبير مثل التعبير الذي قدمته لتعيين date_field القيمة :

$query = new Doctrine_Query();

$query->update('test')
    ->set('date_field', 'NOW() - interval 2 hour')
    ->where('id = ?', 1)
    ->execute();

var_dump($query->getSql());

SQL الذي أحصل عليه كإخراج هو هذا:

string 'UPDATE test SET date_field = NOW() - interval 2 hour WHERE id = ?' (length=65)

أي نوع يشبه ما تريد ، إذا لم أكن مخطئًا ؛-)


ولمجرد التأكد من ذلك ، دعنا نجلب خطنا مرة أخرى:

$testAfter = Doctrine::getTable('Test')->find(1);
var_dump($testAfter->toArray());

وأحصل على هذه النتيجة:

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)

بالنظر إلى التاريخ والوقت ، يبدو أن هذا يعمل - Hoorray!

وللتأكد ، دعنا نستفسر عن البيانات مباشرة من DB:

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)

و ... yeeeepe!


حسنًا ، الآن ، الأجزاء غير الجيدة: أن أكون قادرًا على استخدام هذا الجملة ، اضطررت إلى إنشاء الاستعلام "باليد" ، لاستخدام set() الطريقة ، بدلاً من القيام بذلك "بشكل جيد" مع فئة النموذج و save() طريقة :-(

الأمر متروك لك الآن لرؤيتك التي يمكن دمجها في فصل النموذج الخاص بك ... استمتع بذلك ؛-)

وإذا وجدت طريقة ، في يوم من الأيام ، لاستخدام تعبيرات مثل هذا في أجزاء أخرى من الاستعلام ، أو للقيام بذلك بطريقة أنظف ، فإنني أقدر حقًا ما إذا كان بإمكانك نشر تعليق لإعلامني ;-)


وهذا ، الوقت ، آمل مخلصًا أن أجد الطريق ^ ^

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top