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



جستجو در دو جدول با ارتباط یک به چند


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

ارسال‌ها: 48
تاریخ عضویت: Apr 2010
رتبه: 0
تشکر: 14
15 بار تشکر شده در 6 پست
ارسال: #1
جستجو در دو جدول با ارتباط یک به چند
سلام دوباره
سوال من درباره فرستادن کوئری برای جستجو توی دیتابیس هست
من دو جدول به نام های Jobs و Addresses دارم که ارتباط بین اونها از نوع یک به چند هست
Jobs 1--n Addresses
کاری که من باید انجام بدم اینه که jobهایی رو پیدا کنم که توی یک شهر حاص باشن
کدی که من برای جستجو نوشتم به شکل زیر هست:
کد PHP:
$cond = array(
        
'OR' => array(
            
'Job.name LIKE' => '%' $searchName '%',
            
'Job.suffix LIKE' => '%' $searchName '%'
            
),
        
'AND' => array(
            
'Job.status LIKE' => '1'
            
'Address.city LIKE' => '%' $searchCity '%'
            
)
        );
$jobs $this->Job->find('all', array('conditions' => $cond'order' => 'Job.id DESC')); 
ولی اروری که میده اینه:
SQL Error: 1054: Unknown column 'Address.city' in 'where clause'

میحوام بدونم برای اینکه توی سرج Jobs از جدول آدرس ها که با اون در ارتباط هست به جه شکل باید استفاده کنم
2011/08/14 04:13 PM
یافتن تمامی ارسال‌های این کاربر نقل قول این ارسال در پاسخ
ghasem.fattahpour آفلاین
Super Moderator
******

ارسال‌ها: 235
تاریخ عضویت: Aug 2010
رتبه: 7
تشکر: 177
241 بار تشکر شده در 114 پست
ارسال: #2
RE: جستجو در دو جدول با ارتباط یک به چند
با احترام یکی از بهترین روش ها استفاده از sub query هست.
مطالعه بفرمایید :
http://book.cakephp.org/view/1030/Comple...Conditions
در باره خطایی هم که دارید باید عرض کنم شما به طور کلی 2 نوع ارتباط دیتابیسی در داخل کیک دارید. یا به صورت join یا به صورت recursive. مثلا زمانی که شما از belongsto استفاده می کنید دارای ارتباط join هستید. ولی وقتی از recursive (hasMany) استفاده می کنید، حداقل یک عملیات select به کل عملیات ها در هنگام واکشی یک مدل اضافه خواهد شد.

حال زملانی که شما می خواهید از جدولی که ارتباط hasMany با آن دارید یک داده را جستجو کنید. باید یکی از راه های زیر را انتخاب نمایید:
کد PHP:
$this->Job->Address->find('all'
یا از طریق modelBind در لحظه، جستجوی خودتون رو انجام بدید.

آنچه می نویسم نشانه دانایی من نیست، نشانه آنچه می دانم است.
---------------------------------------------------------------------------
(آخرین تغییر در این ارسال: 2011/08/15 01:18 AM توسط ghasem.fattahpour.)
2011/08/14 10:52 PM
یافتن تمامی ارسال‌های این کاربر نقل قول این ارسال در پاسخ
 تشکر شده توسط : mimre saleh MajidVIP
mimre آفلاین
تازه کار
*

ارسال‌ها: 48
تاریخ عضویت: Apr 2010
رتبه: 0
تشکر: 14
15 بار تشکر شده در 6 پست
ارسال: #3
RE: جستجو در دو جدول با ارتباط یک به چند
ممنون از توضیحاتتون
اون صفحه که دادین رو خوندم و مورد من مشابه مثال نهم هست. Posts belongsTo Author
مال من اینجوریه: Addresses belongsTo Jobs
... ولی چرا این ارور رو به من میده و تیبل آدرس رو نمیشناسه نمیدونم
کلا Address.city رو یک ستون توی جدول Jobs تصور میکنه و مصلما پیداش هم نمیکنه
2011/08/15 01:16 AM
یافتن تمامی ارسال‌های این کاربر نقل قول این ارسال در پاسخ
ghasem.fattahpour آفلاین
Super Moderator
******

ارسال‌ها: 235
تاریخ عضویت: Aug 2010
رتبه: 7
تشکر: 177
241 بار تشکر شده در 114 پست
ارسال: #4
RE: جستجو در دو جدول با ارتباط یک به چند
با احترام
آیا شما در مدل تعریف ابتدایی ارتباطات را انجام داده اید؟
اما با توجه به تعریف شما ارتباط شما به طور حتم hasMany می باشد. اندکی بررسی کنید ببینید ایا این تعریف بنده درست است یا خیر؟
( یک عنوان کاری می تواند چند ادرس داشته باشد. )

اگر که این حرف درست بود یعنی در هنگام انجام عملیات جستجو از طریق cake، جداول هیچگونه ارتباط به حالت join با یکدیگر ندارند. و باید از روش های دیگری استفاده کنید.

موفق باشید.

آنچه می نویسم نشانه دانایی من نیست، نشانه آنچه می دانم است.
---------------------------------------------------------------------------
2011/08/15 05:25 AM
یافتن تمامی ارسال‌های این کاربر نقل قول این ارسال در پاسخ
saleh آفلاین
Administrator
*******

ارسال‌ها: 993
تاریخ عضویت: Dec 2009
رتبه: 12
تشکر: 402
873 بار تشکر شده در 561 پست
ارسال: #5
RE: جستجو در دو جدول با ارتباط یک به چند
1- شما در صورتی که ارتباط رو درست بر قرار کرده باشید. این امکان وجود داره که recursive رو ری 0 یا 1- گزاشته باشید. در این حالت مدل های مرتبط رو در نظر نمیگیره.

اما بهترین روش برای این کارها استفاده از رفتار کننده containable هست. جدید من خیلی باهاش حال میکنم.
2011/08/15 10:33 AM
مشاهده سایت کاربر یافتن تمامی ارسال‌های این کاربر نقل قول این ارسال در پاسخ
 تشکر شده توسط : ghasem.fattahpour mimre payamsp
mimre آفلاین
تازه کار
*

ارسال‌ها: 48
تاریخ عضویت: Apr 2010
رتبه: 0
تشکر: 14
15 بار تشکر شده در 6 پست
ارسال: #6
RE: جستجو در دو جدول با ارتباط یک به چند
(2011/08/15 05:25 AM)ghasem.fattahpour نوشته است:  با احترام
آیا شما در مدل تعریف ابتدایی ارتباطات را انجام داده اید؟
اما با توجه به تعریف شما ارتباط شما به طور حتم hasMany می باشد. اندکی بررسی کنید ببینید ایا این تعریف بنده درست است یا خیر؟
( یک عنوان کاری می تواند چند ادرس داشته باشد. )

اگر که این حرف درست بود یعنی در هنگام انجام عملیات جستجو از طریق cake، جداول هیچگونه ارتباط به حالت join با یکدیگر ندارند. و باید از روش های دیگری استفاده کنید.

موفق باشید.

سلام دوست من
بله تعاریف اولیه درست هستن . خودمم شک به اونا کردم و چند بار چک کردمشون
و درسته ارتباط به شکل hasMany هست. آیا این ارتباط امکان این جستجو رو نداره؟
و روش های دیگه چیه؟

چیزی که به ذهن من رسید اینه که سرچ به جالت عادی انجام بشه و بهد از اون توی آرایه که به دست میاد آدرس هایی که مورد نظر ما نیستن و jobهای مربوط به اونها حذف بشه.
البته این به نظرم یه مقداری برنامه رو سنگین مکنه. درسته یا نه؟
به هر جال منتظر پیشنهادای شما هستم
2011/08/17 10:18 PM
یافتن تمامی ارسال‌های این کاربر نقل قول این ارسال در پاسخ
saleh آفلاین
Administrator
*******

ارسال‌ها: 993
تاریخ عضویت: Dec 2009
رتبه: 12
تشکر: 402
873 بار تشکر شده در 561 پست
ارسال: #7
RE: جستجو در دو جدول با ارتباط یک به چند
در تاپیک دیگرتون هم تذکر دادم که این روش فیلتر گزاری کاملا اشتباه هست.

یعنی شما باید به صورت کامل آنجه که مورد نیاز هست رو از دیتابیس واکشی کنید.


برای بررسی بهتر لطفا هر دو مدلتون رو با اکشن که که جستجو رو انجام میدید قرار بدید. تا ببینییم مشکل در کجاست
2011/08/18 12:10 AM
مشاهده سایت کاربر یافتن تمامی ارسال‌های این کاربر نقل قول این ارسال در پاسخ
 تشکر شده توسط : ghasem.fattahpour
mimre آفلاین
تازه کار
*

ارسال‌ها: 48
تاریخ عضویت: Apr 2010
رتبه: 0
تشکر: 14
15 بار تشکر شده در 6 پست
ارسال: #8
RE: جستجو در دو جدول با ارتباط یک به چند
این مدل Job هست
کد PHP:
<?php
class Job extends AppModel {

    var 
$name 'Job';
    var 
$actsAs = array('Containable');
    var 
$validate = array(
        
'manager_id' => array(
            
'rule' => 'numeric'
            
'allowEmpty' => true
            
),
        
'name' => array('notempty'),
        
'status' => array('numeric')
    );



    var 
$hasMany = array(
        
'Address' => array(
            
'className' => 'Address',
            
'foreignKey' => 'job_id',
            
'dependent' => false,
            
'conditions' => '',
            
'fields' => '',
            
'order' => '',
            
'limit' => '',
            
'offset' => '',
            
'exclusive' => '',
            
'finderQuery' => '',
            
'counterQuery' => ''
        
)
    );
}
?>

این مدل Adress

کد PHP:
<?php
class Address extends AppModel 
{
    var 
$name 'Address';
    var 
$validate = array(
        
'job_id' => array(
            
'rule' => 'numeric',
            
'allowEmpty' => true),
        
'country' => array('notempty'),
        
'city' => array('notempty'),
        
'no' => array(
            
'rule' => 'numeric',
            
'allowEmpty' => true)
    );

    
//The Associations below have been created with all possible keys, those that are not needed can be removed
    
var $belongsTo = array(
        
'Job' => array(
            
'className' => 'Job',
            
'foreignKey' => 'job_id',
            
'conditions' => '',
            
'fields' => '',
            
'order' => ''
        
)
    );
}
?>


در حال حاظر با راهنمایی هایی که توی این پست داشتم اکشن جستجو به این شکل در اومده:
آدرس هایی که شهر مورد نظر رو ندارن حذف میشن ولی Jobهایی که هیچ آدرسی ندارن و یا آدرس هایی دارن که شهر مورد نظر ما نیست، حذف نمیشن
کد PHP:
     */
    function 
search()
    {
        
$this->Job->recursive 2;

        if (!empty(
$this->data))
        {
            
$searchName trim($this->data['Job']['search_name']);
            
$searchCity trim($this->data['Job']['search_city']);
            
            if (
$searchid = (int)$searchName)
                
// $this->set('searchWord', $searchid);
                
$this->redirect(array('action' => 'view' $searchid));
                
            
            
$cond = array(
                    
'OR' => array(
                        
'Job.name LIKE' => '%' $searchName '%',
                        
'Job.suffix LIKE' => '%' $searchName '%'
                        
),
                    
'AND' => array(
                        
'Job.status LIKE' => '1' 
                        
)
                    );
            
            
            
// $this->Job->contain('Manager', 'Address', 'Jobinfopage', 'Dir', 'Address.Phonenumber');
            /*
            $this->Job->contain( array(
                'Address' => array (
                    'conditions' => array(
                        'Address.city LIKE' => '%' . $searchCity . '%'
                    )
                ),
                'Jobinfopage', 'Dir', 'Address.Phonenumber'
            ));
            */
            
$jobs $this->Job->find(
                        
'all', array(
                            
'order' => 'Job.id DESC'
                            
'conditions' => array(
                                
'OR' => array(
                                    
'Job.name LIKE' => '%' $searchName '%',
                                    
'Job.suffix LIKE' => '%' $searchName '%'
                                    
),
                                
'AND' => array(
                                    
'Job.status LIKE' => '1'
                                
)
                            )
                            , 
'contain' => array(
                                
'Jobinfopage',
                                
'Dir',
                                
'Address' => array(
                                    
'Phonenumber',
                                    
'conditions' => array(
                                        
'Address.city LIKE' => '%' .$searchCity '%'
                                    
)
                                )
                            )
                            
                        )
                    );

            for (
$i=0$i <= count($jobs); $i++)
            {
                if (empty(
$jobs[$i]['Address']))
                    unset(
$jobs[$i]);
            }
            
$this->set('jobs'$jobs);
        }
    } 
2011/08/19 06:51 PM
یافتن تمامی ارسال‌های این کاربر نقل قول این ارسال در پاسخ
saleh آفلاین
Administrator
*******

ارسال‌ها: 993
تاریخ عضویت: Dec 2009
رتبه: 12
تشکر: 402
873 بار تشکر شده در 561 پست
ارسال: #9
RE: جستجو در دو جدول با ارتباط یک به چند
تقریبا درست عمل کردید جز اون حلقه آخر که می تونستید شرط خالی بودن آدرس رو هم در کوئری تون قرار بدید.


روش جدید که بهش رسیدم در جستجو های سنگین و رابطه ای این هست که بیام یک ویو در مای اسکیو ال درست کنم. و کوئوری های مورد نظرم رو در اون قرار بدم. وبعد اون رو فقط صدا بزنم. از نظر سرعت و حافظه نتیجه 10 برابر سریعتر و بهینتر میشه.
2011/08/19 07:19 PM
مشاهده سایت کاربر یافتن تمامی ارسال‌های این کاربر نقل قول این ارسال در پاسخ
mimre آفلاین
تازه کار
*

ارسال‌ها: 48
تاریخ عضویت: Apr 2010
رتبه: 0
تشکر: 14
15 بار تشکر شده در 6 پست
ارسال: #10
RE: جستجو در دو جدول با ارتباط یک به چند
یک راه برای این مسئله پیدا کردم
اینجا میذارم که اگه ایراد داره دوستان لطف کنن بگن و اگرم نداره دوساتن دیگه اگر با این مسئله روبرو شدن استفاده کنن

راه حل همون طور که saleh گفت استفاده از containable هست . در حقیقت ایجاد فیلتر و یا شرط توی آرایه مربوط به containble برای جدولی که ارتباط وجود داره
به این شکل:

کد PHP:
$jobs $this->Job->find(
    
'first',
    array(
        
'contain' => array(
            
'Address' => array('country = IRAN''city = shiraz')
        ),
        
'conditions' => array(....)
    )
); 
2011/10/25 02:54 PM
یافتن تمامی ارسال‌های این کاربر نقل قول این ارسال در پاسخ
 تشکر شده توسط : saleh ghasem.fattahpour parsig
ghasem.fattahpour آفلاین
Super Moderator
******

ارسال‌ها: 235
تاریخ عضویت: Aug 2010
رتبه: 7
تشکر: 177
241 بار تشکر شده در 114 پست
ارسال: #11
RE: جستجو در دو جدول با ارتباط یک به چند
مرسی از روحیه پیگیری شما.

آنچه می نویسم نشانه دانایی من نیست، نشانه آنچه می دانم است.
---------------------------------------------------------------------------
2011/10/25 08:18 PM
یافتن تمامی ارسال‌های این کاربر نقل قول این ارسال در پاسخ
 تشکر شده توسط : saleh mimre
ارسال موضوع  ارسال پاسخ 


پرش در انجمن: