نحوه ایجاد کوئری Update در کلاس PDOQueryBuilder

پرسیده شده
فعالیت 1231 روز پیش
دیده شده 356 بار
1

سلام وقت بخیر

یه ابهامی برام پیش اومده

 

ما برای اجرای یک کوئری Update داشتیم:

$sql = "UPDATE users SET name=?, surname=?, sex=? WHERE id=?";
$stmt= $pdo->prepare($sql);
$stmt->execute([$name, $surname, $sex, $id]);

جایی که قراره دیتا از ورودی جاگذاری بشه یک ‘?’ (place holder) قرار میدادیم، بعد از طریق متد execute مقادیر را به ترتیب پاس می دادیم.

شما توسط متد where شرط ?=id را ایجاد کردید، ولی داخل متد update که باید fields هامون رو هم به صورت ?=name و غیره ایجاد می کردیم، داخل حلقه foreach نوشتید:

    public function update(array $data)
    {
        $fields = [];
        foreach ($data as $column => $value) {
            $fields[] = "{$column} = '{$value}'";
        }
        $fields = implode(', ', $fields);
        $conditions = implode(' AND ', $this->conditions);

        $sql = "UPDATE {$this->table} SET {$fields} WHERE {$conditions}";
        $stmt = $this->connection->prepare($sql);
        $stmt->execute($this->values);   // only conditions
        return $stmt->rowCount();
    }

یعنی همینجا مقادیر را بهش پاس دادید، سپس داخل execute فقط مقادیر conditions را پاس دادید.

 

بهتر نبود که اینجوری می نوشتیم:

    public function update(array $data)
    {
        $fields = [];
        foreach ($data as $column => $value) {
            $fields[] = "{$column} = ?";
        }
        $fields     = implode(', ', $fields);
        $conditions = implode(' AND ', $this->conditions);

        $sql = "UPDATE {$this->table} SET {$fields} WHERE {$conditions}";
        
        $stmt = $this->connection->prepare($sql);
        $stmt->execute( array_merge( array_values($data), $this->values ) );  // fields and conditions
        return $stmt->rowCount();
    }

ایجوری دقیقا ما کوئری update را ایجاد کردیم و مقداردهی کردیم.

ممنون

فایل پیوست

1
حذف شده

سلام .. 

 

راه‌های زیادی هست برای انجام این مورد،‌ و راهی که شما هم استفاده کردید کاملا درست هست.

 

یکی از دلایلی که من این کار رو انجام دادم به این خاطر بود که در این حالت شما میتونید جای where و update رو عوض کنید .. در واقع امکان این موضوع وجود داره که شما به صورت زیر کوئری بزنید :‌

 

$this->builder->update(['name' => 'value'])->where(['name' => 'value']);
فایل پیوست

مهرداد سامی

توسط

مهرداد سامی

21 آذر 99

جلسه پروژه ORM - بروزرسانی اطلاعات