PDA

View Full Version : سوال: table relations در کیک



zoghal
یک شنبه 20 اردیبهشت 1388, 08:44 صبح
در کار با تیبل ها و کیک پی اچ پی با چیز هایی که دیدم ایمان آوردم

حالا دو تا سوال دارم،
1-hasAndBelongsToMany (HABTM) رو فهمیدم متها فکر مکنم اشتباه درک کرده باشم، این سیستم یا یک تیبل واسطه سیستم relastion و رول بک رو انجام میده؟ و روش دقیق پیاده سازیی چی هست؟


2- ما دو تا تیبل داریم
1- تیبل album :


CREATE TABLE `photoblogs` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(400) COLLATE utf8_persian_ci NOT NULL,
`titlef` varchar(400) COLLATE utf8_persian_ci DEFAULT NULL,
`date` int(11) NOT NULL,
`info` text COLLATE utf8_persian_ci,
`infof` text COLLATE utf8_persian_ci,
`filename` varchar(255) COLLATE utf8_persian_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_persian_ci;


تیبل عکس ها :



CREATE TABLE `photos` (
`id` int(11) NOT NULL,
`photoblog_id` int(11) NOT NULL,
`titlep` varchar(400) COLLATE utf8_persian_ci DEFAULT NULL,
`titlepf` varchar(400) COLLATE utf8_persian_ci DEFAULT NULL,
`ext` char(5) COLLATE utf8_persian_ci DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_persian_ci;


خوب رابطه تبیل ها کاملا مشخص هست.

حالا من می خوام زمانی که کل تیبل photoblogs رو واکشی میکنم بیاد اولین رکورد از مجموعه رکورد های که با هر رکورد در photoblogs مرتبط هست رو هم واکشی کنه،


$this->Photoblog->recursive = 0;
$this->Photoblog->find('all');



این کد ها همه رو واکشی میکنه مثلا اگر یک رکورد در تیبل photoblogs با ای دی 1 داشته باشیم و در تیبل photo هم 5 رکورد که با photoblog_id مرتبط هست رو هم واکشی میکنه
در صورتی که من فقط رکورد اولش رو می خوام


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

realman
دوشنبه 21 اردیبهشت 1388, 10:19 صبح
2- ما دو تا تیبل داریم

این کد ها همه رو واکشی میکنه مثلا اگر یک رکورد در تیبل photoblogs با ای دی 1 داشته باشیم و در تیبل photo هم 5 رکورد که با photoblog_id مرتبط هست رو هم واکشی میکنه
در صورتی که من فقط رکورد اولش رو می خوام


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

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



$this->Photoblog->recursive = 1;
$this->Photoblog->bindModel(
array('hasMany' => array(
'photo' => array(
'className' => 'photo',
'limit' => '1'
)
)
)
);
$Photoblogs = $this->Photoblog->find('all');
$this->set('Photoblogs',$Photoblogs);

realman
دوشنبه 21 اردیبهشت 1388, 10:22 صبح
در کار با تیبل ها و کیک پی اچ پی با چیز هایی که دیدم ایمان آوردم

حالا دو تا سوال دارم،
1-hasAndBelongsToMany (HABTM) رو فهمیدم متها فکر مکنم اشتباه درک کرده باشم، این سیستم یا یک تیبل واسطه سیستم relastion و رول بک رو انجام میده؟ و روش دقیق پیاده سازیی چی هست؟




اگه میشه سوالت رو یکم واضحتر با جزئیات بپرس.تا بدونم دقیقا با کجاش مشکل داری.

zoghal
سه شنبه 22 اردیبهشت 1388, 10:24 صبح
مرسی در مورد سوال دوم هم خودم به bindModel رسیدم

اما سوال اول در روش hasAndBelongsToMany ، در این روش معلوم هست که یک تیبل با رابطه های n به n (ریلیشن) هست.

تو مثال ها دیدم که یک تیبل واسطه ایجاد میشه . این مورد رو میخواستم توضیح بدید

zoghal
چهارشنبه 23 اردیبهشت 1388, 09:37 صبح
من شدیدا گیج شدم سر این نحوه ریلیشن ها

فرض کنید 4 تا تیبل داریم، که وابستگیشون به این صورت هست

تیبل 1 <--- تیبل 2 <--- تیبل 3 ---> تیبل 4

حالا ما در مدل تیبل 3 هستیم ، میخوام با یک find('alll') همه اطلاعات رو بدست بیارم؟ چطوری میشه؟ اینکا رو کرد؟

zoghal
چهارشنبه 23 اردیبهشت 1388, 21:23 عصر
خوب تقریبا فهمیدم چی به چی هست، منتها موندم تو این موضوع که آیا بهتر نیست برای بیشتر تیبل ها از روش hasAndBelongsToMany استفاده کنیم؟

realman
چهارشنبه 23 اردیبهشت 1388, 23:40 عصر
خوب امتحان ماهم تموم شد اومدیم.
استفاده ار HABTM برای تمام جدول هایی که نیاز به relation دارن درست مثل اینه که بگی من می خوام ماشین بخرم، حالا که اینطوره یکدفعه برم اتوبوس بخرم!!!
هر چیزی یک هزینه ای داره و باری رو به Application شما وارد می کته.به طور کلی در کار با جداولی که از رابطه HABTM استفاده می کنن به شدت دچار پیچیدگی میشین و همچنین از لحاظ سرعت به طور قابل ملاحظه ای (به دلیل ارتباط Many To Many) دچار افت میشین.
بهتره از هر کدوم از سه شیوه :

hasOne(ارتباط یک به یک)
hasMany(ارتباط یک به چند)
hasAndBelongsToMany(ارتباط چند به چند)

در جای خودش استفاده بشه.