View Full Version : اپدیت شدن یک فیلد با relation
masiha68
جمعه 11 اردیبهشت 1394, 18:50 عصر
سلام دوستان
من میخوام وقتی یک ریلشن اجرا شد یکی از فیلدهای اون اپدیدت بشه ...به نظرتون همچین چیزی ممکنه :
کد من به این شکله
'notic'=>array(self::HAS_MANY,'Notification','user_id','ord er'=>'id desc'),
حالا میخوام هر بار که این ریلشن لود شد فیلد view مقدارش اپدیت بشه
masiha68
جمعه 11 اردیبهشت 1394, 18:52 عصر
یه سوال دیگه هم اینه که در مورد ریلشن ها ایا لود شدن همون لیزی لودینگه یا نه همون اول میاد و کل اطلاعات رو از دیتابیس استخراج می کنه و نشون میده
مثلا من واسه هر کاربر این ریلشن ها رو نوشتم
return array(
'profile'=>array(self::HAS_ONE,'Profile','user_id'),
'noticCount'=>array(self::STAT,'Notification','user_id'),//add view condition
'notic'=>array(self::HAS_MANY,'Notification','user_id','ord er'=>'id desc'),
'friend'=>array(self::HAS_ONE,'Friend','user_id','condition' =>'state=1'),
'friendRequest'=>array(self::STAT,'Friend','user_id','params'=>array(':id'=>Yii::app()->user->id),'condition'=>'user_id =:id and state=0'),
'messageCount'=>array(self::STAT,'Message','user_id','condition'=>'view=0 '),
);
یعنی هر بار که مدل یوزر فراخوانی میشه این اطلاعات هم از دیتابیس خونده میشه ؟
MMSHFE
شنبه 12 اردیبهشت 1394, 00:44 صبح
خیر خونده نمیشه مگه اینکه توی with با کمک پارامتر together خودتون حالت Eager Loading رو استفاده کنید. مثال:
$posts = Posts::model()->with(array('comments' => array('together' => true)))->findAll();
برای اینکه یک فیلد هم هربار تغییر کنه کافیه چنین کاری توی مدل مربوطه انجام بدین:
public function afterFind()
{
$this->updateCounters(array('view'=>1), 'id=:id', array(':id'=>$this->id));
}
masiha68
شنبه 12 اردیبهشت 1394, 06:35 صبح
راستش من تا حالا از with استفاد مکردم و هر بار با استفاده از رابطه ها اطلاعات رو به دست میارم ....مثلا
$memo=Memo::model->findAll();
$memo->user->profile->email;
یعنی با استفاده از رابطه ها میام و اطلاعات رو از پروفایل استخراج می کنم . (کد رو همینجوری نوشتم )
MMSHFE
شنبه 12 اردیبهشت 1394, 09:55 صبح
این حالت ساده ترین قابلیت Relational AR هست. با with میتونید شرط بگذارین. برای مثال، اگه میخواین 5 کامنت آخر هر پست رو بدست بیارین میتونید اینطوری کار کنید:
$posts = Posts::model()->with(array('comments'=>array(
'condition'=>'comments.confirmed=1',
'order'=>'comments.id DESC',
'limit'=>5,
)))->findAll('t.confirmed=1');
$foreach($posts as $post) {
$comments = $post->comments;
}
اینجا با وجود اینکه شرط گذاشتین، چون از together استفاده نکردین و بهش مقدار true ندادین، همچنان ساختار Lazy Loading پابرجاست و تا وقتی کامنتهای یک پست رو صدا نزدین، توی حافظه نمیان و هروقت صدا زدین هم فقط 5 تای آخر میان.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.