ورود

View Full Version : مشکل در دستیابی به activerecord های موجود در قسمت ریلیشن مدل



jionelmessi
جمعه 10 بهمن 1393, 21:22 عصر
با سلام
من دارم یه سیستمی منویسم که شبیه یک وبلاگ
الان تو این سیستم دو نوع دسته بندی برای پست ها دارم
دسته بندی اصلی و فرعی

مدل دسته بندی اصلی کدش اینه تو قسمت ریلیشناش





/**
* @return array relational rules.
*/
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(
'postSubGroups' => array(self::HAS_MANY, 'PostSubGroup', 'main_group_id'),
);
}





و کد مدل دسته بندی فرعی عم اینه :





/**
* @return array relational rules.
*/
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(
'posts' => array(self::HAS_MANY, 'Post', 'sub_group_id'),
'mainGroup' => array(self::BELONGS_TO, 'PostMainGroup', 'main_group_id'),
);
}




ریلیشن بین این دو دسته بندی اینه که یک دسته بندی اصلی می تونه n تا دسته بندی فرعی داشته باشه
بعد امدم داخل کنترلری که صفحه مدیریت دسته بندی را نشون مده این کدو نوشتم :







/**
* Display PostMainGroup page
*/
public function actionPostSubGroup()
{
$this->render('postSubGroupPage', array(
'pageTitle' => 'مدیریت گروه فرعی پست ها',
'model' => new PostSubGroup,
'part' => 'PostSubGroup',
'baseUrl' => Yii::app()->BaseUrl
)
);
}





و هنگامی که توی view مدیریت دسته بندی ها می خوام یه کمبو بزارم که تمام دسته بندی های اصلی که وارد شدرو نشون بده تا انتخاب منم با ارور مواجه می شم
کد dropdowm اینه :



<?php echo $form->dropDownList(
$model,
'main_group_id',
$model->mainGroup->MainGroupOptions
// 'placeholder' => ' گروه اصلی پست را از این قسمت انتخاب کنید.', 'class'=> 'form-control')
);





و کد تابع getMainGroupOptions که در مدل PostMainGroup هست اینه:





/**
* retrive all maingroup that added to system
* @return array of key=>value maingroup records
*/
public function getMainGroupOptions()
{
$mainGroups = $this->model()->findAll();
return CHtml::listData($mainGroups, 'id', 'name');
}






و توی فایل ویو با error :
Trying to get property of non-object
مواجه می شم کجاش مشکل داره کارم؟

MMSHFE
جمعه 10 بهمن 1393, 21:34 عصر
بجای $this->model()->findll() از self::model()->findAll() استفاده کنید.

jionelmessi
جمعه 10 بهمن 1393, 21:57 عصر
اینکارو کردم اصلا از اونجا رور نمده ریلیشن mainGroup نمیشناسه
وقتی توی ویو مدیریت دسته بندی فرعی میام اینو منویسم خروجیش falses



isset($model->mainGroup)

بعدشم ریلیشن posts میشناسه ولی اینو نه کجاش غلطه کارم؟

jionelmessi
جمعه 10 بهمن 1393, 22:32 عصر
کسی نبود جوا ب بده؟ مگه اینطور نیس که با این کار به اکتیو رکورد دیگر ارتباط برقرار می کنیم و به اعضای ائن می تونیم دسترسی داشته باشیم پس چرا اینجا ارئور مده؟

Borland.C
شنبه 11 بهمن 1393, 10:33 صبح
self::model()->with('mainGroup')->findAll()

jionelmessi
شنبه 11 بهمن 1393, 15:51 عصر
من اصلا مشکلم تو گرفتن رکوردا نیس وقتی می هوام از طری active record گروه فرعی در فایل ویو مدیریت گروه فرعی به active record گروه اصلی دستبیابی داشته باشم با ارور
trying to get propery of none object روبرو می شم

jionelmessi
شنبه 11 بهمن 1393, 16:57 عصر
مشکلو پیدا کردم اول باید یه نمونه از یک مدل خاص بگیریم بعد دستیابی پیدا کنیم
یعنی با این کد :


$model = PostSubGroup::model*()->findByPk('1')
$model->mainGroup->MainGroupOptions

ولی اگه ما بخواهیم اینطوری دسترسی پیدا کنیم در حالی که جدا ولمونم حتی خالی از رکور باشند چیکار کنیم؟




$model = new PostSubGroup;
$model->mainGroup->MainGroupOptions


یعنی چطور از طریق یک activerecord به تابع activerecord دیگر دسترسی پیدا کنیم؟

MMSHFE
شنبه 11 بهمن 1393, 17:06 عصر
ببینید، شما وقتی یک مدل جدید میسازین، relationهاش خالیه یعنی mainGroup نال هست و یک شئ از مدل PostMainGroup نیست و درنتیجه نمیتونید به فیلدها و متدهای داخلیش دسترسی پیدا کنید. راه مناسبتر اینه که متد getMainGroupOptions رو static کنید و بصورت MainGroupOptions::getMainGroupOption() بهش دسترسی پیدا کنید.

jionelmessi
شنبه 11 بهمن 1393, 21:39 عصر
ممنون ولی من این مدلی دستیابی پیدا می کنم مشکلی که نداره؟


PostMainGroup::model()->MainGroupOptions


ولی من حرفم اینه آیا راهی است مثلا از طریق activerecord گروه فرعی به شی activerecord گروه اصلی دسترسی پیدا کنیم؟
اینجوری:



$model = new PostSubGroup;
$model->PostMainGroup

MMSHFE
یک شنبه 12 بهمن 1393, 09:01 صبح
ببینید، فکر کنم شما مفهوم ارتباطها رو خوب متوجه نشدین. وقتی شما یک شئ جدید میسازین از کلاس PostSubGroup، فیلد main_group_id اون مقدار null داره و درنتیجه $model->PostMainGroup به هیچ رکوردی توی جدول PostMainGroup اشاره نمیکنه و null هست. ولی وقتی با find یک رکورد رو پیدا کنید از جدول PostSubGroup که فیلد main_group_id اون null نباشه، اونوقت میتونید به راحتی به مدل PostMainGroup مربوطه ازطریق رابطه ها دسترسی پیدا کنید. بنابراین وقتی رابطه ای وجود نداره، باید مستقیماً ازطریق خود جدول PostMainGroup وارد عمل بشین و متد getMainGroupOptions رو صدا بزنید (حالا یا به روش static و یا با روشی که خودتون استفاده کردین).