رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
ارتباط بین فرزند و والد در جدول category (حل شد)
#1
تو پروژه ی 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 داره یا خیر ؟
پاسخ
تشکر شده توسط:
#2
فیلد parent_id رو Nullable گذاشتین؟
پاسخ
تشکر شده توسط: mary
#3
کد فرمتون رو بگذارین چون احساس میکنم Null نمیشه. دقت کنید که Null رو نباید توی کوتیشن بگذارین توی کوئری. مثال:
UPDATE `category` SET `parent_id`=NULL WHERE (`id`='5');

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


در قسمت ویرایش گفتم اگر کاربر از منو ، گزینه ی " بخش اصلی " رو انتخاب کرد اینو ست کنه :
$data['parent_id']=NULL;
پاسخ
تشکر شده توسط:
#5
اینو تست کنید:
$data->parent_id = null;
پاسخ
تشکر شده توسط: mary
#6
مشکل در کد 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 خطا میده .
پاسخ
تشکر شده توسط:
#7
خوب یه 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();
}
پاسخ
تشکر شده توسط: mary
#8
خیلی ممنونم . حل شد .
پاسخ
تشکر شده توسط:




کاربران در حال بازدید این موضوع: 1 مهمان