PDA

View Full Version : سوال در مورد ارتباط جداول



barname_newis
چهارشنبه 17 اردیبهشت 1393, 14:35 عصر
سلام دوستان عزیز
من برای بخشی از پروژه فروشگاهیم به مشکل خوردم که خواهش میکنم کمک کنید
قسمت مشخصات هر محصول (مشخصاتی که بین تمام محصولات مشترک نیست و هر محصول بسته به نوع میتونه مشخصات منحصر به فردی داشته باشه برای مثال کتاب "نویسنده" و "ناشر" داره ولی لپتاپ این مشخصات رو نداره و میتونه مشخصاتی نظیر "میزان شارژ باتری" و "نوع lcd" داشته باشه)
برای پیاده سازی این قسمت من از یه جدول استفاده میکنم که کاربر میاد مشخصات (مثل ناشر ، نویسنده ، میزان شارژ باتری ، نوع lcd و ....) رو در اون جدول ثبت میکنه (اسم این جدول رو گذاشتم product_features)
خب طبیعی هست که مشخصاتی که بالا نام بردم باید مقادیری هم داشته باشه من این مقادیر رو در دو جدول دیگه ثبت کردم یک جدول برای مقادیر پیش فرض که کاربر خودش اون ها رو ثبت میکنه تا در ثبت محصولات مشابه راحت تر باشه و نخواد دائما اسامی که تکرار میشن رو وارد کنه (مثلا تو فروش کتاب ناشر های محدودی داریم که کاربر اسم ناشرین رو یک بار وارد میکنه و در زمان ایجاد یک محصول در صورت وجود نام ناشر کتاب مربوطه اون رو دیگه تایپ نکنه و از کادر select اون ناشر رو انتخاب کنه) . اسم این جدول رو هم گزاشتم produc_feature_defaults
در صورتی هم که مقدار پیش فرض مناسبی برای اون مشخصه تو جدول ثبت نشده بود از طریق جدول سوم بتونه اسمش رو وارد کنه . اسم این جدول رو هم گذاشتم product_feature_values
عکس زیر رو از محیط پرستا شاپ گرفتم که منم میخوام همین بخش رو پیاده سازی کنم :
http://www.uploadax.com/images/46070003864154748735.jpg



حالا برای پیاده سازی این قسمت مشکل دارم . چطور با یک بار ارتباط با بانک اطلاعات سه جدول رو بخونم؟ چطور زمان submit شدن فرم اطلاعات این قسمت رو تو جدول مربوطه ذخیره کنم؟
این کد های متد relation مدل product من هست :

public function relations()
{
// NOTE: you may need to adjust the relation name and the related
// class name for the relations automatically generated below.
return array(
'comments' => array(self::HAS_MANY, 'Comments', 'products_product_id'),
'productAttributeFeatures' => array(self::HAS_MANY, 'ProductAttributeFeatures', 'products_product_id'),
'productImagesProductImage' => array(self::BELONGS_TO, 'ProductImages', 'product_images_product_image_id'),
'productFeaturesProductFeature' => array(self::BELONGS_TO, 'ProductFeatures', 'product_features_product_feature_id'),
'productCategories' => array(self::MANY_MANY, 'ProductCategories', 'products_has_product_categories(products_product_ id, product_categories_product_category_id)'),
);
}


ممنون میشم کامل راهنمایی کنید

MMSHFE
جمعه 19 اردیبهشت 1393, 02:13 صبح
این ارتباطی که شما میخواین، بهش میگن ارتباط چند ریختی که بدلیل مشکلات خاصی که داره و اصلاً توی طراحی و اصول مهندسی دیتابیس توصیه نمیشه، در Yii هم پشتیبانی نشده. برای رسیدن به منظور خودتون هم میتونید توی جدول products خودتون دو فیلد باید بگذارین (یکی feature_default_id و یکی feature_value_id) که هر دو قابل null شدن هستن (DEFAULT NULL). حالا این ارتباطها رو تعریف میکنید:

public function relations()
{
return array(
'productDefaultFeatures' => array(self::HAS_MANY, 'ProductFeatureDefault', 'products_product_id'),
'productFeatureValues' => array(self::HAS_MANY, 'ProductFeatureValues', 'products_product_id'),
...
);
}
موقع ذخیره کردن هم اگه از قسمت پیشفرضها یکی انتخاب شده بود، اون رو ذخیره کنید و قسمت مقدار سفارشی رو null کنید و یا برعکس.
امیدوارم منظورم رو تونسته باشم برسونم.