زمان جاری: 2012/05/25, 05:55 PM خوش آمدید مهمان گرامی! (ورودعضویت)



ارتباط مدلهای رابطه ای


ارسال موضوع  ارسال پاسخ 
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
رتبه موضوع:
 
ارتباط مدلهای رابطه ای
نویسنده پیام
sibetorsh آفلاین
تازه کار
*

ارسال‌ها: 29
تاریخ عضویت: Oct 2011
رتبه: 0
تشکر: 65
3 بار تشکر شده در 3 پست
ارسال: #1
ارتباط مدلهای رابطه ای
سلام دوستان
من چندوقتی هست که با کیک دارم کار می کنم! و الان اولین بار کیک می پزم!Smile
حالا ازتون می خوام راهنماییم کنید. بعضی جاها رو موندم نمی دونم باید چی کار کنم!
من برای تمرین دارم یه فروم طراحی می کنم!
ساختار دیتابیس به صورت زیر هست.
کد:
CREATE TABLE IF NOT EXISTS `comments` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `topic_id` int(10) unsigned NOT NULL,
  `comment` varchar(255) COLLATE utf8_persian_ci NOT NULL,
  `user_id` int(10) unsigned NOT NULL,
  `created` datetime NOT NULL,
  `modified` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_persian_ci AUTO_INCREMENT=6 ;

CREATE TABLE IF NOT EXISTS `topics` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `subject` varchar(255) COLLATE utf8_persian_ci NOT NULL,
  `abstract` varchar(500) COLLATE utf8_persian_ci NOT NULL,
  `body` text COLLATE utf8_persian_ci NOT NULL,
  `created` datetime NOT NULL,
  `modified` datetime NOT NULL,
  `user_id` int(10) unsigned NOT NULL,
  `views` int(10) unsigned NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_persian_ci AUTO_INCREMENT=9 ;

CREATE TABLE IF NOT EXISTS `users` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(255) COLLATE utf8_persian_ci NOT NULL,
  `password` varchar(50) COLLATE utf8_persian_ci NOT NULL,
  `email` varchar(255) COLLATE utf8_persian_ci NOT NULL,
  `created` datetime NOT NULL,
  `modified` datetime NOT NULL,
  `confirmed` varchar(1) COLLATE utf8_persian_ci NOT NULL DEFAULT '0',
  `confirm_code` varchar(36) COLLATE utf8_persian_ci NOT NULL,
  `fullname` varchar(255) COLLATE utf8_persian_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_persian_ci AUTO_INCREMENT=3 ;

حالا سوال من اینجاست که من توی یه action به نام home که لیست topic ها رو نشون میده . می خوام در یه ستون تاریخ آخرین فردی که کامنت گذاشته با نام کاربر رو نشون بدم.
اما نمی دونم باید چه طوری این کار رو انجام بدم!
کد PHP:
<div id="content-wrapper">
    <
div id="content-pad">
        <?
php e($form->error('Question.question'null, array('class'=> 'message'))); ?>
        <?php e($form->error('Question.questioner'null, array('class'=> 'message'))); ?>
        
        <?php if(empty($topics)) : ?>
            No topic
        <?php else : ?>
            <table class="datagrid">
                <caption class="gridHeader" >تمام عناوین</caption>
                <thead>
                    <tr>
                        <th>ردیف</th>
                        <th>موضوع</th>
                        <th>مشاهده ها</th>
                        <th>پاسخ ها</th>
                        <th>آخرین کامنت</th>
                        <th>تاریخ ایجاد</th>
                        <th>تاریخ ویرایش</th>
                    </tr>
                </thead>
                <tbody>
                <?php $i=0?>
                <?php foreach($topics as $topic) : ?>
                <?php 
                    $i
=$i+1;
                    if((
$i%2)==0) :
                
?>
                    <tr class="even">
                <?php
                    
else : 
                
?>
                    <tr class="odd">
                <?php endif; ?>
                    <td><?php e($i); ?></td>
                    <td style="text-align: right;">
                        <?php 
                            e
($html->link($topic['Topic']['subject'],array('controller'=>'topics','action'=>'show',$topic['Topic']['id'])));
                            
e("<br />");
                            
e($topic['Topic']['abstract']);    
                            
e("(".$topic['User']['fullname'].")");
                        
?>
                    </td>
                    <td><?php e($topic['Topic']['views']);?></td>
                    <td>
                        <?php
                            $count_comment
=count($topic['Comment']);
                            
$count_comment_arr=$count_comment-1;
                            if (
$count_comment==0
                            {
                                
e("بدون پاسخ");
                            }
                            else 
                            {
                                
e($count_comment);
                            }
                        
?>
                    </td>
                    <td>
                        <?php
                            
                                
[b]????????????      [/b]
                            }
                             
                        
?>
                    </td>
                    <td><?php echo $persiandate->pdate('Y/m/d'strtotime($topic['Topic']['created'])); ?></td>
                    
                    <td><?php e($topic['Topic']['modified']);?></td>
                </tr>
                <?php endforeach; ?>    
                </tbody>
            </table>
            <?php e($paginator->prev()); ?>
            <?php e($paginator->numbers()); ?>
            <?php e($paginator->next()); ?>
            <div class="pagingFooter gridFooter" style="background-color: rgb(246, 246, 246);>
                <div id="paging>
                    <img id="disablePrev" alt="قبلی" src="../img/spacer.gif">
                    <a href="depositShow.action">
                        <img id="next" src="../img/spacer.gif" aria-describedby="ui-tooltip-2">
                    </a>
                </div>
            </div>
        <?php endif; ?>
    </div>
    
</div> 
2011/12/14 07:00 PM
یافتن تمامی ارسال‌های این کاربر نقل قول این ارسال در پاسخ
saleh آفلاین
Administrator
*******

ارسال‌ها: 993
تاریخ عضویت: Dec 2009
رتبه: 12
تشکر: 402
873 بار تشکر شده در 561 پست
ارسال: #2
RE: ارتباط مدلهای رابطه ای
نحوه واکشی داده ها در اکشنتون رو به همراه مدلتون اینجا قرار بدید؟!

سوال: شما چه سورسی رو دارید تغییر می دید که از ورژن 1.2 استفاده می کنید؟!
2011/12/14 10:59 PM
مشاهده سایت کاربر یافتن تمامی ارسال‌های این کاربر نقل قول این ارسال در پاسخ
sibetorsh آفلاین
تازه کار
*

ارسال‌ها: 29
تاریخ عضویت: Oct 2011
رتبه: 0
تشکر: 65
3 بار تشکر شده در 3 پست
ارسال: #3
RE: ارتباط مدلهای رابطه ای
(2011/12/14 10:59 PM)saleh نوشته است:  سوال: شما چه سورسی رو دارید تغییر می دید که از ورژن 1.2 استفاده می کنید؟!
منظورتون رو متوجه نشدم!

(2011/12/14 10:59 PM)saleh نوشته است:  نحوه واکشی داده ها در اکشنتون رو به همراه مدلتون اینجا قرار بدید؟!
action کنترلر
کد PHP:
function home()
    {
        
$this->set('topics',$this->Topic->find('all'));
        
$this->set('topics',$this->paginate('Topic'));
    } 

مدل comment:
کد PHP:
<?php
class comment extends AppModel
{
    var 
$name='Comment';
    var 
$belongsTo=array(
                        
'Topic'=>array(
                                        
'className'=>'Topic'
                                        
),
                        
'User'=>array(
                                        
'className'=>'User'    
                                        
)            
                        );
    
    var 
$validate=array(
                        
'comment'=>array(
                                        
'rule'=>array('minLength',1),
                                        
'required'=>TRUE,
                                        
'allowEmpty'=>FALSE,
                                        
'message'=>'Comment cannot be empty'
                                        
)
                                    
                        );    
}
?>

مدل topic
کد PHP:
<?php
class topic extends AppModel
{
    var 
$name='Topic';
    var 
$belongsTo=array(
                        
'User'=>array(
                                    
'className'=>'User'
                                    
)
                        );
    var 
$hasMany=array(
                        
'Comment'=>array(
                                        
'className'=>'Comment'
                                        
)
                        );
    var 
$validate=array(
                        
'subject'=>array(
                                        
'rule'=>array('minLength',1),
                                        
'required'=>TRUE,
                                        
'allowEmpty'=>FALSE,
                                        
'message'=>'Topics cannot be empty'
                                        
),
                        
'abstract'=>array(
                                        
'rule'=>array('minLength',1),
                                        
'required'=>TRUE,
                                        
'allowEmpty'=>FALSE,
                                        
'message'=>'Abstract cannot be empty'
                                        
),
                        
'body'=>array(
                                        
'rule'=>array('minLength',1),
                                        
'required'=>TRUE,
                                        
'allowEmpty'=>FALSE,
                                        
'message'=>'Content cannot be empty'
                                        
),                
                        );    
    
}
?>

مدل user
کد PHP:
<?php
class user extends AppModel
{
    var 
$name='User';
    var 
$hasMany=array(
                    
'Topic'=>array(
                                    
'className'=>'Topic'
                                    
),
                    
'Comment'=>array(
                                    
'className'=>'Comment'
                                    
)
                        );
    var 
$validate=array(
                    
'username' => array(
                                    
'notempty' => array(
                                                        
'rule' => array('minLength'1),
                                                        
'required' => true,
                                                        
'allowEmpty' => false,
                                                        
'message' => 'User name cannot be empty'
                                                        
),
                                    
'unique' => array(
                                                    
'rule' => array('checkUnique''username'),
                                                    
'message' => 'User name taken. Use another'
                                                    
)
                                        ),
                    
'password'=>array(
                                    
'notempty'=>array(
                                                    
'rule'=>array('minLength',1),
                                                    
'required'=>TRUE,
                                                    
'allowEmpty'=>FALSE,
                                                    
'message'=>'Please enter a password'
                                                    
),
                                    
'passwordSimilar'=>array(
                                                            
'rule'=>'checkPasswords',
                                                            
'message'=>'Different password re entered.'
                                                            
)
                                    ),
                    
'email'=>array(
                                
'rule'=>'email',
                                
'required'=>TRUE,
                                
'allowEmpty'=>FALSE,
                                
'message'=>'Please enter a valid email'
                                
)
                        );
    function 
checkUnique($data,$fieldName)
    {
        
$valid=false;
        if(isset(
$fieldName) && $this->hasField($fieldName))
        {
            
$valid=$this->isUnique(array($fieldName=>$data));
        }
        return 
$valid;
    }
    
    function 
checkPasswords($data)
    {
        if(
$data['password']==$this->data['User']['password2hashed'])
            return 
true;
        return 
FALSE;
    }
}
?>
2011/12/15 12:56 AM
یافتن تمامی ارسال‌های این کاربر نقل قول این ارسال در پاسخ
saleh آفلاین
Administrator
*******

ارسال‌ها: 993
تاریخ عضویت: Dec 2009
رتبه: 12
تشکر: 402
873 بار تشکر شده در 561 پست
ارسال: #4
RE: ارتباط مدلهای رابطه ای
کد PHP:
منظورتون رو متوجه نشدم
من احساس کردم شما دارید یک سورس آماده رو تغییر میدید. که دارید از 1.2 استفاده می کنید.

کد PHP:
function home()
    {
        
$this->set('topics',$this->Topic->find('all'));
        
$this->set('topics',$this->paginate('Topic'));
    } 
دلیلتون برای این کار بالا چه بوده. چون هر دو یک کار رو انجام می دهند یکی پیج بندی میکنه یکی کل رکورد ها رو واکشی می کنه.
در آخر هم هر دو نتیجه رو به یک اسم به ویو ارسال می کنید. پس
کد PHP:
$this->set('topics',$this->Topic->find('all')); 
اضافه هست.


اما جواب سوالتون
اول باید از رفتار کننده Containable f به مدل Topic اتچ کنید. و بعد به صورت زیر استفاده کنید.

کد PHP:
<?
    $Topics 
$this->Topic->find(
        
'all' ,
        array(
            
'contain' => array(
                
'Comment' => array(
                    
'limit' => 1,
                    
'order' =>  'Comment.created desc'
                
)
            )
        )
    )
   
$this->set('topics',$Topics);
?>

این آخرین کامنت یک تاپیک رو بدست میاره.
2011/12/15 11:12 PM
مشاهده سایت کاربر یافتن تمامی ارسال‌های این کاربر نقل قول این ارسال در پاسخ
 تشکر شده توسط : sibetorsh payamsp
sibetorsh آفلاین
تازه کار
*

ارسال‌ها: 29
تاریخ عضویت: Oct 2011
رتبه: 0
تشکر: 65
3 بار تشکر شده در 3 پست
ارسال: #5
RE: ارتباط مدلهای رابطه ای
سلام آقا صالح
دست شما در نکنه! ممنونم!
اگه تعداد کل کامنت ها رو بخواهیم بازیابی کنیم، باید یکبار دیگه find('all') کنیم؟
اگه امکان داره یه کمی در مورد این رفتارکننده توضیح بدید یا لینک معرفی کنید
ببخشید من انقدر سوال می پرسم! شرمنده! آخه اول کار هستم
ممنونم!
(آخرین تغییر در این ارسال: 2011/12/17 03:22 PM توسط sibetorsh.)
2011/12/17 02:29 PM
یافتن تمامی ارسال‌های این کاربر نقل قول این ارسال در پاسخ
mohsened آفلاین
محسن افتخاردادخواه
**

ارسال‌ها: 73
تاریخ عضویت: May 2010
رتبه: 1
تشکر: 71
83 بار تشکر شده در 31 پست
ارسال: #6
RE: ارتباط مدلهای رابطه ای
2011/12/17 05:39 PM
مشاهده سایت کاربر یافتن تمامی ارسال‌های این کاربر نقل قول این ارسال در پاسخ
 تشکر شده توسط : sibetorsh saleh
saleh آفلاین
Administrator
*******

ارسال‌ها: 993
تاریخ عضویت: Dec 2009
رتبه: 12
تشکر: 402
873 بار تشکر شده در 561 پست
ارسال: #7
RE: ارتباط مدلهای رابطه ای
شما برای این کار باید از قابلیت روکورد کانتر استفاده کنید. مراجعه کنیید به بخش روابط مدل ها در داکیومنت
2011/12/18 03:47 PM
مشاهده سایت کاربر یافتن تمامی ارسال‌های این کاربر نقل قول این ارسال در پاسخ
 تشکر شده توسط : sibetorsh
ارسال موضوع  ارسال پاسخ 


پرش در انجمن: