PDA

View Full Version : مشکل در relationها



desatir7316
دوشنبه 26 اسفند 1392, 12:12 عصر
سلام دوستان
من وقتی query زیر رو اجرا می کنم درست اجرا میشه:

SELECT
tbl_user.*
FROM
tbl_user,tbl_project,tbl_project_user_assignment
WHERE
tbl_project_user_assignment.project_id = tbl_project.id AND tbl_project_user_assignment.user_id = tbl_user.id

اینم نتیجش:



id
username
email
password
last_login_time
create_time
create_user_id
update_time
update_user_id



1
useone
userone@yahoo.com
userone
0000-00-00 00:00:00
0000-00-00 00:00:00
NULL
0000-00-00 00:00:00
NULL


2
usertwo
usertwo@yahoo.com
usertwo
0000-00-00 00:00:00
0000-00-00 00:00:00
NULL
0000-00-00 00:00:00
NULL



حالا این relation ها هم دارم که به صورت اتوماتیک generate شدن:
project model:



return array(
'issues' => array(self::HAS_MANY, 'Issue', 'project_id'),
'users' => array(self::MANY_MANY, 'User', '{{project_user_assignment}}(project_id, user_id)'),
);


user model:



return array(
'issues' => array(self::HAS_MANY, 'Issue', 'requester_id'),
'issues1' => array(self::HAS_MANY, 'Issue', 'owner_id'),
'tblProjects' => array(self::MANY_MANY, 'Project', '{{project_user_assignment}}(user_id, project_id)'),
);


ولی این تابع هیچ کاربری رو برنمی گردونه:


public function getUserOptions()
{
return CHtml::listData($this->users, 'id', 'username');
}


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

desatir7316
دوشنبه 26 اسفند 1392, 13:41 عصر
مسئولین محترم لدفا رسیدیگی کنید

MMSHFE
دوشنبه 26 اسفند 1392, 14:23 عصر
لطفاً دقیقتر توضیح بدین. مثلاً کد آخری رو کجا نوشتین و کجا دارین صداش میزنید. اگه دقیقاً مطابق آموزش پیش رفته باشین، باید کار کنه.

desatir7316
دوشنبه 26 اسفند 1392, 15:06 عصر
اون تابع رو توی create issue صدا زدم:


<div class="row">
<?php echo $form->labelEx($model,'owner_id'); ?>
<?php echo $form->dropDownList($model,'owner_id',Project::model()->getUserOptions()); ?>
<?php echo $form->error($model,'owner_id'); ?>
</div>



طبع آموزش ها پیش می رم

تابع getUserOptions رو هم توی مدل Project نوشتم

MMSHFE
دوشنبه 26 اسفند 1392, 15:28 عصر
خوب نباید هم برگردونه چون پروژه شما هنوز کاربری نداره. شما باید بجای this->users$ توی getUserOptions از Users::model()->findAll(); استفاده کنید که همه کاربران رو نشون بده. اگه میخواین کاربران پروژه جاری رو نشون بده (طبق آموزش) باید قبلش کاربر به پروژه بصورت دستی اضافه کنید تا این قابلیت رو بتونید تست کنید. بعداً وقتی پروژه جدید تعریف میشه، بصورت خودکار کاربرها هم بهش اضافه میشن.

desatir7316
دوشنبه 26 اسفند 1392, 15:39 عصر
کاربران رو به صورت دستی اضافه کردم
توی این کوری نشون دادم که توی پست اول هست:

SELECT
tbl_user.*
FROM
tbl_user,tbl_project,tbl_project_user_assignment
WHERE
tbl_project_user_assignment.project_id = tbl_project.id AND tbl_project_user_assignment.user_id = tbl_user.id

می خوام کاربران پروژه جاری رو نشون بدم

توی actionCreate مربوط به issue هم مقدار زیر ست شده:


$model=new Issue;
$model->project_id = $this->_project->id;

MMSHFE
دوشنبه 26 اسفند 1392, 15:42 عصر
میتونید TeamViewer بدین؟ حدس میزنم یه جایی Relationهاتون مشکل داره

desatir7316
دوشنبه 26 اسفند 1392, 15:44 عصر
البته جدول tbl_project_user_assignment هم خالی نیست

SELECT * FROM `tbl_project_user_assignment`




project_id
user_id



1

1



1

2

desatir7316
دوشنبه 26 اسفند 1392, 15:50 عصر
میتونید TeamViewer بدین؟ حدس میزنم یه جایی Relationهاتون مشکل داره

اینجا قابل حل نیست؟
فکر نکنم دیگه در اون حد باشه مشکلش که بخواد teamviewer بدیم

realtionهارو خودش generate کرده کلا

شما هر قسمتی از کد رو می خواید بگید تا براتون بذارم

MMSHFE
دوشنبه 26 اسفند 1392, 15:56 عصر
الآن از اینجا دقیقاً نمیتونم مشکلتون رو بطور کامل رصد کنم چون ساختار کامل فایلها رو نمیبینم و فقط به بخشی از پروژه شما دسترسی دارم ولی توی TeamViewer معمولاً اینجور مشکلات در کمتر از 5 دقیقه حل میشه. درهرحال از this->users$ یک print_r توی فایل views/project/view.php بگیرین ببینید چی چاپ میشه.

desatir7316
دوشنبه 26 اسفند 1392, 16:31 عصر
چیزی رو عوض نکردم که بخواد تغیر کنه، همون طبق آموزش هاست
var_dump گرفتم، یه آرایه خالی برگردوند

MMSHFE
دوشنبه 26 اسفند 1392, 17:30 عصر
پس یه جای کار اشکال داره. نباید خالی باشه. توی phpMyAdmin چک کنید relation دارن جدولها؟ Engineها همه InnoDB هست؟ برای اینجور چیزاست که میگم TeamViewer بدین زودتر به نتیجه میرسیم. ضمناً اینکه میگین چیزی عوض نشده رو هم بهش شک دارم. برای مثال، یکی از دوستان که برنامه نویس با تجربه ای هم هست، مشکلی داشت که وقتی گفتم ممکنه از فلان قسمت باشه گفت دیگه اینقدرها هم مبتدی نیستم ولی توی TeamViewer مشخص شد سهواً دستشون روی کیبورد خورده و یک حرف اضافه تر توی همون قسمت تایپ شده بود که باعث اون مشکلشون شده بود.

desatir7316
دوشنبه 26 اسفند 1392, 22:08 عصر
بالاخره پیدا شد
من سعی کرده بودم از طریق خود مدل project این رو بگیرم ولی باید از طریق مدل جاری این کار می کردم:


<div class="row">
<?php echo $form->labelEx($model,'owner_id'); ?>
<?php echo $form->dropDownList($model,'owner_id',$model->project->getUserOptions()) ?>
<?php echo $form->error($model,'owner_id'); ?>
</div>


در حالی که اینجوری نوشته بودم:


<div class="row">
<?php echo $form->labelEx($model,'owner_id'); ?>
<?php echo $form->dropDownList($model,'owner_id',Project::model()->getUserOptions()); ?>
<?php echo $form->error($model,'owner_id'); ?>
</div>


آقای شهرکی از شما هم ممنون که انقدر پیگیر بودید

MMSHFE
سه شنبه 27 اسفند 1392, 12:56 عصر
آهان، درسته چون توی Project::model() شما فقط یک مدل استاتیک دارین که به هیچ رکورد خاصی اشاره نمیکنه و درنتیجه داخلش به this$ دسترسی ندارین چون شیئی وجود نداره که this$ معنا پیدا کنه. میتونستین اینطوری هم بنویسید:

Project::model()->findByPk(1)->userOptions
که کاربران پروژه شماره 1 رو بهتون میداد.

desatir7316
سه شنبه 27 اسفند 1392, 22:03 عصر
تشکر




Project::model()->findByPk(1)->userOptions


فکر کنم اون قبلی که با $this گرفتیم بهتر باشه چون دیگه اطلاعات قبلا گرفته شدن ولی این به هر حال باید دوباره اطلاعات رو از توی DB بکشه بیرون
حالا شایدم این روش مزایایی نسبت به $this داشته باشه که اگه داره ممنون می شم اشاره کنید

MMSHFE
سه شنبه 27 اسفند 1392, 22:14 عصر
نه همون this$ درسته. فقط خواستم بدونید چرا ()Project::model به تنهایی کار نمیکرد.