تالار گفتمان nCIS.ir

نسخه‌ی کامل: ارتباط بین فرزند و والد در جدول category (حل شد)
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
تو پروژه ی mvc تو جدول category چنین رابطه ای رو ایجاد کردم :


`blog`.`category`, CONSTRAINT `category_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `category` (`id`) ON DELETE SET NULL ON UPDATE CASCADE


در بخشی از پروژه در قسمت ویرایش دسته ها ، میخوام کاری کنم که در مدیریت بشه ، یک فرزند رو تغییر داد و اونو والد کرد . یعنی parent_id اون بشه NULL .

اما این خطا اتفاق می افته :

نقل قول:
Cannot add or update a child row: a foreign key constraint fails (`blog`.`category`, CONSTRAINT `category_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `category` (`id`) ON DELETE SET NULL ON UPDATE CASCADE)
)

آیا ارتباطی به cascade داره یا خیر ؟
فیلد parent_id رو Nullable گذاشتین؟
کد فرمتون رو بگذارین چون احساس میکنم Null نمیشه. دقت کنید که Null رو نباید توی کوتیشن بگذارین توی کوئری. مثال:
UPDATE `category` SET `parent_id`=NULL WHERE (`id`='5');

و این کد اشتباهه:
UPDATE `category` SET `parent_id`='NULL' WHERE (`id`='5');
بله این فیلد رو پیش فرض null گزاشتم که موقع درج اگر والدی انتخاب نشد ، NULL ثبت بشه .
هم مقدار پیش فرض رو NULL گزاشتم و هم nullable


در قسمت ویرایش گفتم اگر کاربر از منو ، گزینه ی " بخش اصلی " رو انتخاب کرد اینو ست کنه :
$data['parent_id']=NULL;
اینو تست کنید:
$data->parent_id = null;
مشکل در کد update ای هست که بصورت PDO نوشتم :

public function update($tabel, $fild = null ,$where = null)
{
    $update = 'UPDATE '.$tabel.' SET ';
    $set=null; $value=null;
    foreach($fild as $key => $values)
    {
        $set .= ', '.$key. ' = :'.$key;
        $value .= ', ":'.$key.'":"'.$values.'"';
    }
    $update .= substr(trim($set),1);
    $json = '{'.substr($value,1).'}';
    $param = json_decode($json,true);

    if($where != null)
    {
        $update .= ' WHERE '.$where;
    }

    $query = parent::prepare($update);
    $query->execute($param);
    $rowcount = $query->rowCount();
    return $rowcount;
}

در قسمت foreach فکر میکنم NULL در رشته قرار میگیره و قبول نمیکنه .

نمیدونم چطور برای مقادیر NULL این کد رو اصلاح کنم . اگر کوتیشن ها رو بردارم برای execute خطا میده .
خوب یه if بگذارین اگه values$ نال بود کوتیشن نگذاره. بعد هم من نفهمیدم چرا JSON رو قاطی ماجرا کردین. این کد رو تست کنید:
public function update($table, $fields = null ,$where = null)
{
    $sql = 'UPDATE ' . $table.' SET ';
    $updateFields = array();
    $params = array();
    foreach($fields as $key => $value) {
        if(is_null($value)) {
            $updateFields[] = '`' . $key . '`=NULL';
        }
        else {
            $updateFields[] = '`' . $key . '`=:' . $key;
            $params[':' . $key] = $value;
        }
    }
    $sql .= implode(', ', $updateFields);
 
    if(!is_null($where)) {
        $sql .= ' WHERE ' . $where;
    }
    $query = parent::prepare($sql);
    $query->execute($params);
    return $query->rowCount();
}
خیلی ممنونم . حل شد .