PDA

View Full Version : تابع model در active record ؟ (حل شد)



redhat2
شنبه 14 دی 1392, 22:23 عصر
سلام ، یه سوال داشتم ، فرض کنید که ما تا مدل به نام post و comment داشته باشیم ، که اینا از active record
، extend میشن ، حالا ما توی post پروپرتی table مون post و توی comment هم comment باشه ، ما فرضا میخوایم در post از مدل comment استفاده کنیم ، وقتی استفادمون تموم شد می خوایم برگردیم به همون Table
یوزر ، میخواستم بدونم که برای همین هست که yii میاد و از این تابع استفاده کنه ، تا Table همون کلاس را set کنه ؟ اینطوره ؟:متفکر:

MMSHFE
شنبه 14 دی 1392, 22:59 عصر
بله دقیقاً. متد ()model توی AR شئ Singleton مربوط به مدل همون کلاس موردنظر رو برمیگردونه.

redhat2
یک شنبه 15 دی 1392, 00:26 صبح
اصلا اینکه ما بیایم و از یه مدل توی یه مدل دیگه استفاده کنیم ، منطقی هست یا نه ؟

MMSHFE
یک شنبه 15 دی 1392, 00:47 صبح
نه به این شکل صحیح نیست ولی ARها در Yii میتونن با هم Relation داشته باشن. مثلاً میتونیم تمام کامنتهای یک پست رو با روشی شبیه Post::model()->findByPk(5)->comments استخراج کنیم یا پست مربوط به یک کامنت خاص رو با روش Comments::model()->findByPk(10)->post بدست بیاریم.

redhat2
یک شنبه 15 دی 1392, 18:07 عصر
خوب اگه ما مثلا دستور اولی که نوشتین را اجرا کنیم ، جدول روی comment ست میشه ، حالا چطوری این جدول مجددا بر می گرده به جدول پست
یعنی باید دوباره از متد استاتیک پست استفاده کنیم تا مجددا جدول روی پست ست بشه ؟ اصلا همچین چیزی درسته ؟

MMSHFE
یک شنبه 15 دی 1392, 21:27 عصر
نه دیگه ببینید، شما مدل Post رو توی یک متغیر میگذارین و بعد، با کمک Relationها، کامنتها رو هم استخراج میکنید. مثال:


$post = Posts::model()->findByPk(5);
echo '<p>' . CHtml::encode($post->title) . '</p>' . PHP_EOL;
foreach($post->comments as $comment) {
echo '<div class="comment">' . CHtml::encode($comment->body) . '</div>' . PHP_EOL;
}
echo '<p class="date">Posted on: <strong>' . date('Y/m/d H:i:s', $post->create_time) . '</strong></p>' . PHP_EOL;

shpegah
دوشنبه 21 بهمن 1392, 00:24 صبح
نه دیگه ببینید، شما مدل Post رو توی یک متغیر میگذارین و بعد، با کمک Relationها، کامنتها رو هم استخراج میکنید. مثال:


$post = Posts::model()->findByPk(5);
echo '<p>' . CHtml::encode($post->title) . '</p>' . PHP_EOL;
foreach($post->comments as $comment) {
echo '<div class="comment">' . CHtml::encode($comment->body) . '</div>' . PHP_EOL;
}
echo '<p class="date">Posted on: <strong>' . date('Y/m/d H:i:s', $post->create_time) . '</strong></p>' . PHP_EOL;


سلام باتوجه به این مثال من میخوام جدولم رو که یک کوئریه نمایش بدم

در view\index اینو اضافه کردم البته فعلا فقط یک فیلد مشخص رو دارم نمایش میدم تا درست بشه بعد بقیه فیلد ها رو ببینم چطور میشه نمایش داد


foreach($model->threads as $thread) {
echo CHtml::encode($thread->num) . PHP_EOL;
}

ولی خطا میده
Trying to get property of non-object
در حالیکه این درسته


echo $model->threads->num;


برای ساخت کوئری از این ریلیشن استفاده شده


'threads' => array(self::BELONGS_TO, 'Threads', 'threadId'),

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

MMSHFE
دوشنبه 21 بهمن 1392, 20:32 عصر
شما میخواین تعداد threadهای زیرمجموعه یک thread خاص رو نشون بدین؟ اگه اینطوریه باید Relation رو اینطوری تعریف کنید:


'parent' => array(self::BELONGS_TO, 'Threads', 'threadId'),
'threads' => array(self::HAS_MANY, 'Threads', 'threadId'),

و به این شکل کار کنید:

echo $model->parent->num;
// or
foreach($model->threads as $thread) {
echo '<p>' . $thread->num . '</p>' . PHP_EOL;
}

دقت کنید که وقتی میگیم self::BELONGS_TO یعنی ActiveRecord جاری، زیرمجموعه یک ActiveRecord دیگه میشه که توی Relation مشخص کردیم (پس parent یا هر اسم دیگه که به Relation دادیم، میشه والد این AR و درنتیجه یکی بیشتر ازش نداریم چون هر thread فقط یک والد داره) ولی وقتی میگیم self::HAS_MANY یعنی AR جاری، یک یا چند AR دیگه بعنوان زیرمجموعه داره که میشه با foreach اونها رو پیمایش کرد.
امیدوارم خوب توضیح داده باشم.