PDA

View Full Version : ایجاد ارتباط MANY_MANY و ایجاد ازتباط با چنیدن جدول همراه با Active Record



mostafa_shoakry
شنبه 30 فروردین 1393, 15:50 عصر
با سلام خدمت دوستان محترم
من یک مشکلی که دارم اینه که فرض کنین که من چنتا جدول دارم مثل محصولات ، آلبوم تصاویر و عکس های آپلود شده مثل تصویر زیر.
118149
tbl_product : شامل تمامی محصولات هست
tbl_album : شامل نام آلبوم های ایجاد شده به همراه نام پوشه ای که در سرور ایجاد میشود تا عکس ها در اون پوشه آپلود شوند.
tbl_image : شامل اطلاعات عکس و کد آلبوم تصاویر که به صورت کلید خارجی می باشد.
و
tbl_product_image : که این جدول رو برای این ایجاد کردم که مثلا برای یک محصول چندین تصویر در نظر گرفته شود.
و ریلیشن ها
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(
'category' => array(self::BELONGS_TO, 'Category', 'category_id'),
'tblImages' => array(self::MANY_MANY, 'Image', '{{product_image}}(product_id, image_id)'),
);
}

Album:


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(
'images' => array(self::HAS_MANY, 'Image', 'id_album'),
);
}

image:


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(
'tblCategories' => array(self::MANY_MANY, 'Category', '{{category_image}}(image_id, category_id)'),
'idAlbum' => array(self::BELONGS_TO, 'Album', 'id_album'),
'tblProducts' => array(self::MANY_MANY, 'Product', '{{product_image}}(image_id, product_id)'),
);
}

مشکل من در پیاده سازی AR این جداول هست.

به عنوان مثال من می خوام 4 تا عکس را برای یک محصول در نظر بگیرم که در این صورت چون عکس های من امکان دارد هر کدام در یک پوشه جداگانه باشد پس من فقط نمی تونم از جدول image سلکت بزنم باید پوشه ای که عکس در اونجا قرار دارد از طریق جدول album در بیارم.
آیا روشی برای این کار هست و با این روابط و جداول می تونم کاری انجام بدم؟

یک روشی دیگر هم هست که می تونم یک جدول ایجاد کنم و مسیر کامل عکس رو در اون جدول ذخیره کنم و جدول product رو با اون ارتباط بدم.

می خوام بدونم کدوم بهتر و راحت تره

MMSHFE
شنبه 30 فروردین 1393, 16:11 عصر
منظورتون رو دقیق تر توضیح بدین. تصاویر توی یک پوشه هستن یا چند پوشه برحسب آلبوم؟

mostafa_shoakry
شنبه 30 فروردین 1393, 20:52 عصر
منظورتون رو دقیق تر توضیح بدین. تصاویر توی یک پوشه هستن یا چند پوشه برحسب آلبوم؟
نه تو چند پوشه بر حسب آلبوم
جدول آلبوم من
118168
جدول عکسها
118169

ببینین من یک جدول محصولات دارم که جدول محصولات من هم به این صورت هست :
118170
حالا سوال من اینه که می خوام برای هر محصول چندین و یا یک عکس انتخاب کنم.
چجوری اینکارو انجام بدم؟

MMSHFE
یک شنبه 31 فروردین 1393, 08:49 صبح
relationها رو اینطوری تنظیم کنید (برای نظم بیشتر) :
Category :

public function relations(){
return array(
'images' => array(self::MANY_MANY, 'Image', '{{category_image}}(category_id, category_id)'),
'products' => array(self::HAS_MANY, 'Product', 'category_id'),
);
}
Product :

public function relations() {
return array(
'category' => array(self::BELONGS_TO, 'Category', 'category_id'),
'images' => array(self::MANY_MANY, 'Image', '{{product_image}}(product_id, image_id)'),
);
}
Album :

public function relations(){
return array(
'images' => array(self::HAS_MANY, 'Image', 'id_album'),
);
}
Image :

public function relations(){
return array(
'album' => array(self::BELONGS_TO, 'Album', 'id_album'),
'categories' => array(self::MANY_MANY, 'Category', '{{category_image}}(image_id, category_id)'),
'products' => array(self::MANY_MANY, 'Product', '{{product_image}}(image_id, product_id)'),
);
}
حالا فرض کنید میخواین توی View مربوط به هر محصول، تمام تصاویرش رو نشون بدین. میتونید از چنین کدی استفاده کنید:

<?php foreach($model->images as $image) : ?>
<img src="<?php echo Yii::app()->homeUrl . '/' . $image->album->folderName . '/' . $image->image; ?>" /><br />
<?php endforeach; ?>

mostafa_shoakry
چهارشنبه 03 اردیبهشت 1393, 16:36 عصر
}[/PHP]
حالا فرض کنید میخواین توی View مربوط به هر محصول، تمام تصاویرش رو نشون بدین. میتونید از چنین کدی استفاده کنید:

<?php foreach($model->images as $image) : ?>
<img src="<?php echo Yii::app()->homeUrl . '/' . $image->album->folderName . '/' . $image->image; ?>" /><br />
<?php endforeach; ?>

در واقع در قسمت بالا مشخص شد که من می تونم تمامی عکس های یک محصول رو به همراه نام پوشه اون بدست بیارم. حالا می خواییم بر عکس حرکت کنیم.
می خوام بدونم یک عکس متعلق به کدوم محصول هست و نام پوشه اون چی هست. در این موقع چجوری دستور رو استفاده کنم؟
امید وارم سوالم واضح باشه

MMSHFE
چهارشنبه 03 اردیبهشت 1393, 20:56 عصر
خوب با دستور image->album$ میتونید ببینید پوشه یک عکس چیه و با image->products$ هم میتونید محصولاتی رو که عکس توی اونها بکار رفته پیدا کنید. دقت کنید که چون ارتباط بین جدول محصولات و تصاویر از نوع چند به چند هست، عکسها یک محصول مرتبط ندارن و با چند محصول در ارتباط هستن.

mostafa_shoakry
چهارشنبه 03 اردیبهشت 1393, 21:44 عصر
خوب با دستور image->album$ میتونید ببینید پوشه یک عکس چیه و با image->products$ هم میتونید محصولاتی رو که عکس توی اونها بکار رفته پیدا کنید. دقت کنید که چون ارتباط بین جدول محصولات و تصاویر از نوع چند به چند هست، عکسها یک محصول مرتبط ندارن و با چند محصول در ارتباط هستن.

باور کنید تازه دارم Yii رو درک میکنم :لبخند:
فک کنم انقد در موردش فک کرده بودم و البته تحقیق ، واسه مساله به این سادگی مغزم هنگیده بود :خجالت: