PDA

View Full Version : سوال: ایجاد دسته بندی و زیر مجموعه



sara.saba90
چهارشنبه 16 مهر 1393, 08:12 صبح
من یه جدول به نام product دارم و یه فیلد داره به نام cat_id که با id جدول category باهم foreignkey میشن.و فیلد category id با parentt_id همون جدول foreign key میشه.(برای ایجاد زیر دسته)الان میخوام داده وارد کنم نمیشه و ارور میده:ناراحت:اینم ارورش


#1452 - Cannot add or update a child row: a foreign key constraint fails (`pccportal`.`category`, CONSTRAINT `fk_my_category` FOREIGN KEY (`parent_id`) REFERENCES `category` (`id`))
چجوری میتونم زیر دسته بسازم؟

vahidqara
چهارشنبه 16 مهر 1393, 08:32 صبح
درود.. شما یه جدول Category دارید یا باید داشته باشید با این فیلدها.. حالا کم و زیاد مهم نیست..:لبخندساده:

id
title
date
parent_id
که میشه خود ارجاء
حالا شما اگه مجموعه ای درج کنید که parent_id صفر باشه مجموعه اصلی میشه دیگه
و اگه یه مجموعه زیر مجموعه دیگه باشه کد اصلیش داخل parent_id قرار میگیره :لبخندساده:

sara.saba90
چهارشنبه 16 مهر 1393, 14:59 عصر
تنها مشکلم زیر مجموعه هست.تو جدول Category,id رو با cat_id,باهم foriegn key کردم ولی هنگام وارد کردن داده همون اروری که بالا گذاشتم رو میده:ناراحت:

desatir7316
چهارشنبه 16 مهر 1393, 15:19 عصر
كد ساخت جدول هاتونو بذاريد ببينم چي نوشتيد، همچنين مقاديري كه ارسال كرديد و ارسال مي كنيد
اينم يه كده براي يه چيزي شبيه مال شما فقط در مورد منو و زير منو هست، مي تونيد كدتونم با اين مقايسه كنيد:

CREATE TABLE wp_mainMenu(
mainMenuId int NOT NULL AUTO_INCREMENT,
title VARCHAR(50) ,
showAccordion BIT,
defaultOpen BIT,
priority INT,
primary key(mainMenuId)
)
default char set utf8
collate utf8_general_ci;

CREATE TABLE wp_subMenu(
subMenuId INT AUTO_INCREMENT,
mainMenuId INT,
title VARCHAR(50),
link VARCHAR(50),
priority INT,
FOREIGN KEY(mainMenuId) REFERENCES wp_mainMenu(mainMenuId) ON DELETE CASCADE ON UPDATE CASCADE,
PRIMARY KEY(subMenuId)
)
default char set utf8
collate utf8_general_ci;

sara.saba90
چهارشنبه 16 مهر 1393, 23:36 عصر
فیلدهای جدولم به این صورته
product
content-title-cat_id-id

category
name-parent_id-id

حالا product,cat_id با category,id با هم foriegn key هستن.و تو جدول id,category با parent_id با هم foriegn key هستن.حالا برای آزمایش اینکه دسته بندی کار میکنه از insert خود phpmyadmin استفاده کردم که اون ارور بالا رو داد.میشه راهنماییم کنید که چجوری مشکلم رو بر طرف کنم؟:افسرده:
برای دسته بندی و زیر مجموعش هر کدوم جدول داشته باشن بهتره یا تو یه جدول باشن؟

desatir7316
چهارشنبه 16 مهر 1393, 23:57 عصر
حالا product,cat_id با category,id با هم foriegn key هستن.

منظورت cat_id از جدول product با id از جدول category هست؟



و تو جدول id,category با parent_id با هم foriegn key هستن.
این دیگه برا چیه؟ اون کد بالا که کامنتش کردم کافیه



فیلدهای جدولم به این صورته
product
content-title-cat_id-id

category
name-parent_id-id


بهتره کد ساخت تیبل هاتونو مثل اون کد بالا درست حسابی بذارید تا بدونیم چی به چیه

دقیقا اون کدی که بالا براتون گذاشتم برای مجموعه و دسته بندی کار می کنه و باید به جای فیلد های من از فیلدهای خودتون استفاده کنید. این کد هارو تست کردید؟

hamedarian2009
چهارشنبه 16 مهر 1393, 23:59 عصر
فیلدهای جدولم به این صورته
product
content-title-cat_id-id

category
name-parent_id-id

حالا product,cat_id با category,id با هم foriegn key هستن.و تو جدول id,category با parent_id با هم foriegn key هستن.حالا برای آزمایش اینکه دسته بندی کار میکنه از insert خود phpmyadmin استفاده کردم که اون ارور بالا رو داد.میشه راهنماییم کنید که چجوری مشکلم رو بر طرف کنم؟:افسرده:
برای دسته بندی و زیر مجموعش هر کدوم جدول داشته باشن بهتره یا تو یه جدول باشن؟

یعنی اومدی تو یه جدول دوتا فیلدو بهم ارتباط دادی؟:متفکر: اصلا میدونی مفهوم ارتباط چیه؟

sara.saba90
پنج شنبه 17 مهر 1393, 08:24 صبح
منظورت cat_id از جدول product با id از جدول category هست؟


این دیگه برا چیه؟ اون کد بالا که کامنتش کردم کافیه



بهتره کد ساخت تیبل هاتونو مثل اون کد بالا درست حسابی بذارید تا بدونیم چی به چیه

دقیقا اون کدی که بالا براتون گذاشتم برای مجموعه و دسته بندی کار می کنه و باید به جای فیلد های من از فیلدهای خودتون استفاده کنید. این کد هارو تست کردید؟
راستش استفاده نکردم چون مطمئن نبودم که برای کار من میشه استفاده کرد؟(برای دسته بندی و زیر دسته هست دیگه؟)
در جدول product هم cat_id با id جدول category با هم foriegn key هستن.
در جدول id,category با cat_id باهم foriegn key هستن.
برای ایجاد زیر مجموعه این کارو کردم.کارم اشتباهه؟الان چیکار باید بکنم؟ممنون میشم راهنماییم کنید؟
اینم از دو تا جدول که درست کردم.



CREATE TABLE product(
id int NOT NULL AUTO_INCREMENT,
cat_id int INDEX ,
title VARCHSR(255),
content VARCHSR(255),
primary key(id)
)


CREATE TABLE category(
id int NOT NULL AUTO_INCREMENT,
parent_id int INDEX ,
name VARCHSR(255),
primary key(id)
)

desatir7316
پنج شنبه 17 مهر 1393, 10:32 صبح
راستش استفاده نکردم چون مطمئن نبودم که برای کار من میشه استفاده کرد؟(برای دسته بندی و زیر دسته هست دیگه؟)

استفاده می کردی، منو و زیر منو با دسته بندی و زیر دسته فرقی نداره، نام و تعداد و نوع فیلد ها مهم بود براتون



در جدول product هم cat_id با id جدول category با هم foriegn key هستن.

توی کدی که گذاشتید همچین چیزی اصلا وجود نداره، حالا چطوری ایجاد کردید نمی دونم


title VARCHSR(255),
در کل نوع فیلد varchsr من ندیدم تو عمرم که شما همه رو از این نوع تعریف کردید






CREATE TABLE product(
id int NOT NULL AUTO_INCREMENT,
cat_id int INDEX ,
....
primary key(id)
)



cat_id دیگه برا چی هست؟ اضافه است



این کد رو نگاه کنید، توی این الان category جدول والد و product جدول فرزنده




CREATE TABLE category(
id int NOT NULL AUTO_INCREMENT,
name VARCHAR(255),
primary key(id)
);


CREATE TABLE product(
id int NOT NULL AUTO_INCREMENT,
cat_id int ,
title VARCHAR(255),
content VARCHAR(255),
primary key(id),
foreign key(cat_id) references category(id) on delete cascade on update cascade
)

MMSHFE
پنج شنبه 17 مهر 1393, 13:01 عصر
ببینید مسئله اینه که طراحیتون مشکل داره. شما برای دسته بندیهای ریشه گفتین parent_id صفر باشه درحالی که رکوردی با id صفر ندارین و خطا تولید میشه. برای حل مشکل، فیلد parent_id رو Nullable کنید و برای ریشه ها این فیلد رو Null بگذارین. توی تنظیمات قیدی که تعریف کردین هم برای ON DELETE گزینه SET NULL رو انتخاب کنید تا اگه یک دسته بندی حذف شد، فرزندانش به ریشه منتقل بشن (درصورت تمایل). قید ON UPDATE رو هم همیشه CASCADE بگذارین تا اگه id یک دسته بندی، رو عوض کردین، parent_id همه فرزندانش بطور خودکار اصلاح بشن.

sara.saba90
پنج شنبه 17 مهر 1393, 18:54 عصر
استفاده می کردی، منو و زیر منو با دسته بندی و زیر دسته فرقی نداره، نام و تعداد و نوع فیلد ها مهم بود براتون


توی کدی که گذاشتید همچین چیزی اصلا وجود نداره، حالا چطوری ایجاد کردید نمی دونم


در کل نوع فیلد varchsr من ندیدم تو عمرم که شما همه رو از این نوع تعریف کردید



cat_id دیگه برا چی هست؟ اضافه است



این کد رو نگاه کنید، توی این الان category جدول والد و product جدول فرزنده




CREATE TABLE category(
id int NOT NULL AUTO_INCREMENT,
name VARCHAR(255),
primary key(id)
);


CREATE TABLE product(
id int NOT NULL AUTO_INCREMENT,
cat_id int ,
title VARCHAR(255),
content VARCHAR(255),
primary key(id),
foreign key(cat_id) references category(id) on delete cascade on update cascade
)


یعنی الان category دسته هست؟و product زیر دسته؟و اگه اینطوره این دو جدول درست کار میکنه؟از این روش استفاده کنم؟ممنون

MMSHFE
پنج شنبه 17 مهر 1393, 19:10 عصر
شما این ساختار رو لازم دارین:
1- ارتباط 1 به n بین جدول product و category برای مشخص شدن اینکه هر محصول متعلق به چه دسته ای هست
2- ارتباط 1 به n بین جدول category با خودش برای مشخص شدن اینکه هر دسته متعلق به چه دسته والدی هست

برای این کار ساختار دیتابیس رو اینطور درنظر بگیرین:
جدول category :
CREATE TABLE `category` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8_bin NOT NULL,
`parent_id` int(11) DEFAULT NULL,
`confirmed` tinyint(1) NOT NULL,
PRIMARY KEY (`id`),
KEY `fk_category_parent` (`parent_id`),
CONSTRAINT `fk_category_parent` FOREIGN KEY (`parent_id`) REFERENCES `category` (`id`) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=1;
جدول product :
CREATE TABLE `product` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`category_id` int(11) NOT NULL,
`title` varchar(255) COLLATE utf8_bin NOT NULL,
`content` varchar(255) COLLATE utf8_bin NOT NULL,
`confirmed` tinyint(1) NOT NULL,
PRIMARY KEY (`id`),
KEY `fk_product_category` (`category_id`),
CONSTRAINT `fk_product_category` FOREIGN KEY (`category_id`) REFERENCES `category` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=1;
حالا توی این ساختار، اگه خواستین یک دسته بندی رو بعنوان ریشه درنظر بگیرین (والد نداشته باشه) باید parent_id رو Null بگذارین و اگه خواستین والد داشته باشه، باید id دسته بندی والد رو توی فیلد parent_id دسته بندی فرزند ثبت کنید. محصولات هم که تکلیفشون مشخصه و ازطریق فیلد category_id ارتباط دارن با جدول category

ضمناً از همین الان عادت کنید یک ساختار مشخص درنظر بگیرین برای اسامی فیلدهاتون. مثلاً من خودم برای کلیدهای خارجی همیشه اسم جدول والد و بعد id_ رو استفاده میکنم. البته معمولاً اسامی جداول رو جمع میگذارم (مثل products یا categories) ولی اسم index ها و... رو مفرد درنظر میگیرم. اینطوری ازنظر نگارشی و دستور زبان انگلیسی هم معنای خوبی پیدا میکنه. الان با این ساختاری که گفتم، اگه یک دسته بندی دارای محصول باشه اجازه نمیده حذفش کنید مگه اینکه قبلش محصولاتش رو جداگانه حذف کرده باشین (اگه بخواین خودکار حذف بشن باید توی قید جدول محصولات در قسمت ON DELETE بجای RESTRICT از CASCADE استفاده کنید. ضمناً اگه یک دسته بندی که دارای فرزند هست رو حذف کنید، فرزندانش به ریشه منتقل میشن (بخاطر وجود SET NULL در قسمت ON DELETE که باعث میشه فیلد کلید خارجی اونها NULL بشه که در منطق سیستمی که گفتم به معنای دسته بندی ریشه است).

اگه باز هم ابهامی بود بفرمایید بیشتر توضیح بدم.

sara.saba90
پنج شنبه 17 مهر 1393, 20:17 عصر
اگه الان parent_id خالی بزارم یعنی دسته پدرو دسته اصلی و اگه ایدی که در اون وجود داره بزارم میشه زیر مجموعه یکی ازدستها درسته؟

desatir7316
پنج شنبه 17 مهر 1393, 20:25 عصر
یعنی الان category دسته هست؟و product زیر دسته؟و اگه اینطوره این دو جدول درست کار میکنه؟از این روش استفاده کنم؟ممنون
بله، یعنی الان category دسته هست و product زیر دسته
این دو جدول هم درست کار میکنن
بله استفاده کنید
در کل چقدر شک دارید در استفاده کردن

MMSHFE
پنج شنبه 17 مهر 1393, 20:28 عصر
نه الان category هم دسته هست و هم زیردسته. همونطور که خودتون گفتین، اگه یک دسته parent_id اون، null باشه یعنی دسته اصلیه و اگه null نباشه یعنی زیردسته اون دسته ای هست که id اش توی فیلد parent_id مشخص شده. product هم که کلاً محصولات هست و ربطی به دسته و زیردسته نداره و هر محصول میتونه توی هر دسته (چه اصلی باشه چه زیردسته) ظاهر بشه (برحسب فیلد category_id)
دقت کنید که parent_id با DEFAULT NULL تعریف شده ولی category_id با NOT NULL یعنی یک محصول نمیتونه دسته بندی نداشته باشه ولی یک دسته میتونه والد نداشته باشه.

sara.saba90
پنج شنبه 17 مهر 1393, 21:38 عصر
ممنون از راهنماییتون،خیلی خوب توضیح دادید

MMSHFE
پنج شنبه 17 مهر 1393, 21:58 عصر
ممنون از نظر لطفتون. البته دکمه تشکر کاربرد قشنگتری داره. :چشمک:

sara.saba90
شنبه 19 مهر 1393, 16:24 عصر
الان میخوام دسته اصلی رو نمایش بدم.این کد رو مینویسم ولی چیزی نمیاره.مشکل از سینتکس sql هست؟


SELECT * FROM `category` WHERE `parent_id`=NULL

MMSHFE
شنبه 19 مهر 1393, 17:07 عصر
SELECT * FROM `category` WHERE (`parent_id` IS NULL)

sara.saba90
شنبه 22 آذر 1393, 15:57 عصر
شما این ساختار رو لازم دارین:
1- ارتباط 1 به n بین جدول product و category برای مشخص شدن اینکه هر محصول متعلق به چه دسته ای هست
2- ارتباط 1 به n بین جدول category با خودش برای مشخص شدن اینکه هر دسته متعلق به چه دسته والدی هست

برای این کار ساختار دیتابیس رو اینطور درنظر بگیرین:
جدول category :
CREATE TABLE `category` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8_bin NOT NULL,
`parent_id` int(11) DEFAULT NULL,
`confirmed` tinyint(1) NOT NULL,
PRIMARY KEY (`id`),
KEY `fk_category_parent` (`parent_id`),
CONSTRAINT `fk_category_parent` FOREIGN KEY (`parent_id`) REFERENCES `category` (`id`) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=1;
جدول product :
CREATE TABLE `product` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`category_id` int(11) NOT NULL,
`title` varchar(255) COLLATE utf8_bin NOT NULL,
`content` varchar(255) COLLATE utf8_bin NOT NULL,
`confirmed` tinyint(1) NOT NULL,
PRIMARY KEY (`id`),
KEY `fk_product_category` (`category_id`),
CONSTRAINT `fk_product_category` FOREIGN KEY (`category_id`) REFERENCES `category` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=1;
حالا توی این ساختار، اگه خواستین یک دسته بندی رو بعنوان ریشه درنظر بگیرین (والد نداشته باشه) باید parent_id رو Null بگذارین و اگه خواستین والد داشته باشه، باید id دسته بندی والد رو توی فیلد parent_id دسته بندی فرزند ثبت کنید. محصولات هم که تکلیفشون مشخصه و ازطریق فیلد category_id ارتباط دارن با جدول category

ضمناً از همین الان عادت کنید یک ساختار مشخص درنظر بگیرین برای اسامی فیلدهاتون. مثلاً من خودم برای کلیدهای خارجی همیشه اسم جدول والد و بعد id_ رو استفاده میکنم. البته معمولاً اسامی جداول رو جمع میگذارم (مثل products یا categories) ولی اسم index ها و... رو مفرد درنظر میگیرم. اینطوری ازنظر نگارشی و دستور زبان انگلیسی هم معنای خوبی پیدا میکنه. الان با این ساختاری که گفتم، اگه یک دسته بندی دارای محصول باشه اجازه نمیده حذفش کنید مگه اینکه قبلش محصولاتش رو جداگانه حذف کرده باشین (اگه بخواین خودکار حذف بشن باید توی قید جدول محصولات در قسمت ON DELETE بجای RESTRICT از CASCADE استفاده کنید. ضمناً اگه یک دسته بندی که دارای فرزند هست رو حذف کنید، فرزندانش به ریشه منتقل میشن (بخاطر وجود SET NULL در قسمت ON DELETE که باعث میشه فیلد کلید خارجی اونها NULL بشه که در منطق سیستمی که گفتم به معنای دسته بندی ریشه است).

اگه باز هم ابهامی بود بفرمایید بیشتر توضیح بدم.
متوجه شدم.الان تنها مشکلم نمایش دسته بندی هست که درست تو منو نمایش بده.اگه میشه راهنمایی کنید که چجوری نمایش بدم؟ممنون

sairon123
شنبه 22 آذر 1393, 16:40 عصر
این فیلم رو ببین مشکلت حل میشه
ایجاد منو چند سطحی و نمایش آن به طور کامل آموزش داده میشه

http://www.daneshjooyar.com/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%B3%D8%A7%D8%AE%D8%AA-%D9%85%D9%86%D9%88-%DA%86%D9%86%D8%AF-%D8%B3%D8%B7%D8%AD%DB%8C-%D8%AF%D8%A7%DB%8C%D9%86%D8%A7%D9%85%DB%8C%DA%A9-%D8%AF%D8%B1-php/