زمان جاری: 2012/05/23, 03:51 AM خوش آمدید مهمان گرامی! (ورودعضویت)



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


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

ارسال‌ها: 135
تاریخ عضویت: Jul 2011
رتبه: 2
تشکر: 197
80 بار تشکر شده در 42 پست
ارسال: #1
Exclamation ارتباط بین چند جدول
سلام
سوال این هست که چطور میشه چند جدول مختلف که با هم ارتباطات مختلفی هم دارند در یکجا با هم بشه از اونها استفاده کرد ؟

مثلا جدول پست ها ، یوزر ها ، موضوعات ، تگ ها ، کامنت ها و ... که ارتباط بین اونها مشخص هست ، حالا اگه کاربر بخواد مطالبی که در یک موضوع نوشته شده رو ببینه باید چه کنیم تا بتوانیم از اطلاعات جداول دیگر هم استفاده بکنیم ؟

( معمولا بین دو تا جدول بیشتر نمیشه ارتباط برقرار کرد ! و کیک بقیه ارتباطات رو در نظر نمی گیره )

کد PHP:
$this->set('cats'$this->Post->Cat->find('all', array('conditions'=>array('Cat.id'=> $id)))) ; 

و ما اطلاعات یوزها ، موضوعات دیگه و ... رو نداریم !!!!
2011/07/19 09:12 AM
یافتن تمامی ارسال‌های این کاربر نقل قول این ارسال در پاسخ
saleh آفلاین
Administrator
*******

ارسال‌ها: 989
تاریخ عضویت: Dec 2009
رتبه: 12
تشکر: 399
870 بار تشکر شده در 560 پست
ارسال: #2
RE: ارتباط بین چند جدول
سلام دوست عزیز . به فروم کیک پی اچ پی خوش آمدید.

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

در ابتدا باید بگم این حرف شما کامل اشتباه هست.
کد:
( معمولا بین دو تا جدول بیشتر نمیشه ارتباط برقرار کرد ! و کیک بقیه ارتباطات رو در نظر نمی گیره )

اولا کیک ارتباطات رو بر اساس مدل ها ایجاد میکنه نه جداول. این دو تا باهم فرق دارند. قالبا شما برای هر جدول یک مدل ایجاد میکنید. اما این امکان هست که یک مدل مجازی باشه یعنی برای یک جدول خاص نباشه. بلکه برای ایجاد ارتباط بین چندین جدول باشه.

ارتباط ها در مدل ها تعریف میشوند. البته امکان این هم هست که هر زمانی خواستید به صورت پا در هوا بین جداول ارتباط بر قرار کنید.

خوب ما جداول زیر رو داریم :

users,Profile,posts,categories,tags

به همین صورت هم ما برای هر کدام از جداول یک مدل داریم
User,Profileو,Post,Category,Tag

تو هر یک از مدل ها ارتباط ها رو تعریف میکنیم

کد PHP:
class User extends AppModel {
    var 
$name 'User';
    var 
$hasMany = array(
        
'Post'
    
);
    var 
$hasOne = array(
        
'Profile'
    
);}

class 
Profile extends AppModel {
    var 
$name 'Profile';
    var 
$belogsTo = array(
        
'User'
    
);
}

class 
Post extends AppModel {
    var 
$name 'Post';
    var 
$hasMany = array(
        
'Tag',
    );
    var 
$belogsTo = array(
        
'User',
        
'Category',
    );
    
}

class 
Category extends AppModel {
    var 
$name 'Category';
    var 
$hasMany = array(
        
'Post',
    );
    
}

class 
Tag extends AppModel {
    var 
$name 'Tag';
    var 
$hasMany = array(
        
'Post',
    );
    



خوب این مدل های ما . و الان هم تو مدل post هستیم.
حالت های زیر رو میتونیم داشته باشیم.


کد PHP:
$this->Post->recursive = -1;
$this->Post->find('all');

در این حالت فقط پست ها رو نمایشت میده 


کد PHP:
$this->Post->recursive 1;
$this->Post->find('all');

پستها به همراه کتگوری و تگ و یوزر ها رو 

کد PHP:
$this->Post->recursive 2;
$this->Post->find('all');

پستها به همراه کتگوری و تگ و یوزر ها رو و پروفایل  هر یوزرو 

این روش معمولی هست.
2011/07/20 07:56 PM
مشاهده سایت کاربر یافتن تمامی ارسال‌های این کاربر نقل قول این ارسال در پاسخ
 تشکر شده توسط : payamsp 786ali ghasem.fattahpour person fiendish
786ali آفلاین
عضو نیمه حرفه ای
**

ارسال‌ها: 135
تاریخ عضویت: Jul 2011
رتبه: 2
تشکر: 197
80 بار تشکر شده در 42 پست
ارسال: #3
RE: ارتباط بین چند جدول
سلام
ممنون از پاسخ کاملی که دادید اما فکر می کنم من مطلب رو بد رسوندم .

ما اگر بخواهیم هر پست چندین موضوع داشته باشد باید از تابع :

کد PHP:
hasAndBelongsToMany 

استفاده کنیم ، حالا موقعی که می خواهیم پست های یک موضوع خاص را پیدا کنیم با کد زیر امکان پذیر است :

کد PHP:
$this->set('cats'$this->Post->Cat->find('all', array('conditions'=>array('Cat.id'=> $id)))) ; 

اما اطلاعات دیگر مربوط به هر پست را چگونه باید پیدا کنیم ( با توجه به اینکه نمی خواهیم هیچ پردازش اضافی در سیستم بوجود بیاید ) ؟
مثلا مطالب یک موضوع را پیدا می کنیم حالا اطلاعات نویسنده ، اطلاعات تگ ها و .... چه می شود ؟ آیا کیک در این حالت ارتباط بین مدل های مختلف را در نظر نمی گیرد ؟
(آخرین تغییر در این ارسال: 2011/07/21 06:07 PM توسط 786ali.)
2011/07/21 06:07 PM
یافتن تمامی ارسال‌های این کاربر نقل قول این ارسال در پاسخ
saleh آفلاین
Administrator
*******

ارسال‌ها: 989
تاریخ عضویت: Dec 2009
رتبه: 12
تشکر: 399
870 بار تشکر شده در 560 پست
ارسال: #4
RE: ارتباط بین چند جدول
لطفا مدل های کاملتون رو قرار بدید. یک جای کارتون اشتباه هست.
2011/07/21 08:08 PM
مشاهده سایت کاربر یافتن تمامی ارسال‌های این کاربر نقل قول این ارسال در پاسخ
ghasem.fattahpour آفلاین
Super Moderator
******

ارسال‌ها: 234
تاریخ عضویت: Aug 2010
رتبه: 7
تشکر: 176
241 بار تشکر شده در 114 پست
ارسال: #5
RE: ارتباط بین چند جدول
با احترام
با توجه به اینکه تمامی مطالب رو مطالع کردم تنها جهت راهنمایی عرض می کنم که احتمال زیاد مطلب اول آقا صالح جواب سوال شماست! مگر اینکه سوال شما جزییات دیگر داشته باشد.
موفق باشید

آنچه می نویسم نشانه دانایی من نیست، نشانه آنچه می دانم است.
---------------------------------------------------------------------------
2011/07/22 03:03 PM
یافتن تمامی ارسال‌های این کاربر نقل قول این ارسال در پاسخ
786ali آفلاین
عضو نیمه حرفه ای
**

ارسال‌ها: 135
تاریخ عضویت: Jul 2011
رتبه: 2
تشکر: 197
80 بار تشکر شده در 42 پست
ارسال: #6
RE: ارتباط بین چند جدول
سلام
ببینید الان مشکل اصلی من اینه که می خواهم پست های مربوط به یک موضوع را جدا کنم ( تا اینجا مشکلی نیست و پست ها را پیدا میکنم ) و این کار در کنترلر پست ها با کد زیر انجام می شود :

کد PHP:
$this->set('cats'$this->Post->Cat->find('all', array('conditions'=>array('Cat.id'=> $id)))) ; 

اما بعد اطلاعات پست ها را ندارم مثل موضوعات دیگر هر پست ، پوزر ها ، تگ ها و ...

مدل ها هم به این شکل هست :

کد PHP:
class Post extends AppModel {
var 
$name="Post";
var 
$hasAndBelongsToMany 'Cat';
var 
$hasOne 'User'

کد PHP:
class Cat extends AppModel {
var 
$name="Cat";
var 
$hasAndBelongsToMany 'Post'


کد PHP:
class User extends AppModel {
var 
$name="User";
var 
$hasMany 'Post'
(آخرین تغییر در این ارسال: 2011/07/24 11:08 AM توسط 786ali.)
2011/07/24 10:21 AM
یافتن تمامی ارسال‌های این کاربر نقل قول این ارسال در پاسخ
saleh آفلاین
Administrator
*******

ارسال‌ها: 989
تاریخ عضویت: Dec 2009
رتبه: 12
تشکر: 399
870 بار تشکر شده در 560 پست
ارسال: #7
RE: ارتباط بین چند جدول
لطفا ساختار جدول کت گوری رو هم بزارید. تا اینجا درست رابطه ها تعریف نشده. ساختار جدول کتگوری و پست و یوزر بزارید تا کامل واستون توزضیح بدم
2011/07/24 07:17 PM
مشاهده سایت کاربر یافتن تمامی ارسال‌های این کاربر نقل قول این ارسال در پاسخ
786ali آفلاین
عضو نیمه حرفه ای
**

ارسال‌ها: 135
تاریخ عضویت: Jul 2011
رتبه: 2
تشکر: 197
80 بار تشکر شده در 42 پست
ارسال: #8
RE: ارتباط بین چند جدول
ممنون از پاسخ شما ، اینم ساختار جداول :

کد PHP:
[b]cats[/b]

id     int(10)
name     varchar(255)
user_id     int(11

کد PHP:
[b]cats_posts[/b]

cat_id     int(11)
post_id     int(11

کد PHP:
[b]posts[/b]

id     int(11)
titles     varchar(255)
bodys     text
dates     datetime
user_id     int
(11


کد PHP:
[b]users[/b]

id     int(10)
username     varchar(255)
pass     varchar(255
2011/07/25 11:07 AM
یافتن تمامی ارسال‌های این کاربر نقل قول این ارسال در پاسخ
saleh آفلاین
Administrator
*******

ارسال‌ها: 989
تاریخ عضویت: Dec 2009
رتبه: 12
تشکر: 399
870 بار تشکر شده در 560 پست
ارسال: #9
RE: ارتباط بین چند جدول
خوب به ترتیب اشتباهاتتون رو میگم.

1- در تعریف ارتباطات مقادیر به صورت آرایه معرفی باید بشه.
کد PHP:
class Post extends AppModel {
var 
$name="Post";
var 
$hasAndBelongsToMany = array( 'Cat');
var 
$hasOne = array('User'); 

2- نام گذاری ها خیلی مهم هست فرضا Cats استباه هست.categories درسته . در نام گزاری فیلد ها از اسم چمع استفاده نکنید. البته الان مشکلی پیش نمیاد . اما بعد حتما به مشکل میخوری.

3- فیلد های که هدف تاریخ هست رو created ,updated بزارید. خود کیک این فیلد ها رو بروز میکنه

4- در ارتباط HABTM در حالت ساده بهتر است که یک مودل برای جدول واسته ایجاد شود.
کد PHP:
Cat.php
    
class Cat extends AppModel
    
{
        public 
$hasMany = array(
            
'PostCat'
        
);
    }
    
    
Post.php
    
class Post extends AppModel
    
{
        public 
$hasMany = array(
            
'PostCat'
        
);
    }

    
post_cat.php
    
class PostCat extends AppModel
    
{
        public 
$belongsTo = array(
            
'Post''Cat'
        
);    
    } 

این روش ساده هست . حالا امتحان کنید.
2011/07/25 01:51 PM
مشاهده سایت کاربر یافتن تمامی ارسال‌های این کاربر نقل قول این ارسال در پاسخ
 تشکر شده توسط : ghasem.fattahpour 786ali payamsp
fiendish آفلاین
عضو جدید
*

ارسال‌ها: 13
تاریخ عضویت: Aug 2011
رتبه: 0
تشکر: 3
1 بار تشکر شده در 1 پست
ارسال: #10
RE: ارتباط بین چند جدول
saleh جان مرسی، توضیحت خیلی کامل بود ولی اینجا
کد PHP:
class Tag extends AppModel {
    var 
$name 'Tag';
    var 
$hasMany = array(
        
'Post',
    ); 
هر پست چندتا تگ داره ولی هر تگ فقط مربوط به یک پسته نه؟
2011/08/19 05:45 PM
یافتن تمامی ارسال‌های این کاربر نقل قول این ارسال در پاسخ
saleh آفلاین
Administrator
*******

ارسال‌ها: 989
تاریخ عضویت: Dec 2009
رتبه: 12
تشکر: 399
870 بار تشکر شده در 560 پست
ارسال: #11
RE: ارتباط بین چند جدول
درک این موضوع همیشه سخت بوده . حتی خودم تا پارسال واسم سوال بود که تگ ها چه کاربردی واقعا دارند.

در مورد تگ و بعضا کتی گوری ها . رابطشون با پست رابطه چند به چند هست.
به زبان ساده هر پست می تواند چندین تگ و چندین موضوع داشته باشد. و از طرف دیگر دلیلی نیست که یک رکورد در جداول تگ ها و موضوعات تکرار شوند.

به همیین خاطر جدول سومی وسط میاد که از تکرار ها جلوگیری کند و فقط رابطهه ها رو نگه داری کنند.

پس جواب شما منفی هست. هر تگ هم میتواند با یک یا چند پست در ارتتباط باشد.
2011/08/19 06:13 PM
مشاهده سایت کاربر یافتن تمامی ارسال‌های این کاربر نقل قول این ارسال در پاسخ
fiendish آفلاین
عضو جدید
*

ارسال‌ها: 13
تاریخ عضویت: Aug 2011
رتبه: 0
تشکر: 3
1 بار تشکر شده در 1 پست
ارسال: #12
RE: ارتباط بین چند جدول
چطور میتونم در یک سطر ایمیل - گروه - پرمیژن کاربر را نشون بدم؟
[تصویر: download.php?img=277]
برای جدول های واسط مدل تعریف نکردم.
2011/08/19 07:27 PM
یافتن تمامی ارسال‌های این کاربر نقل قول این ارسال در پاسخ
saleh آفلاین
Administrator
*******

ارسال‌ها: 989
تاریخ عضویت: Dec 2009
رتبه: 12
تشکر: 399
870 بار تشکر شده در 560 پست
ارسال: #13
RE: ارتباط بین چند جدول
یعنی چی؟ متوجه نمیشم . اگر سوالتون در ادامه سوال این تاپیک نیست لطفا تاپیک جدید برنید و صد البته خوب توضیح بدید.
2011/08/19 08:26 PM
مشاهده سایت کاربر یافتن تمامی ارسال‌های این کاربر نقل قول این ارسال در پاسخ
fiendish آفلاین
عضو جدید
*

ارسال‌ها: 13
تاریخ عضویت: Aug 2011
رتبه: 0
تشکر: 3
1 بار تشکر شده در 1 پست
ارسال: #14
RE: ارتباط بین چند جدول
یه جدول می خوام نشون بدم که واقع در کنترلر یوزر و اکشن ایندکس هست.
"لیست کاربران" که در این جدول نام کاربر، ایمیل، تاریخ ثبت نام، سطح دسترسی، گروه رو نشون بدم، همین.
برای همه جداول هم یک مدل نوشتم. البته به جز جدول های واسط.
2011/08/19 10:01 PM
یافتن تمامی ارسال‌های این کاربر نقل قول این ارسال در پاسخ
saleh آفلاین
Administrator
*******

ارسال‌ها: 989
تاریخ عضویت: Dec 2009
رتبه: 12
تشکر: 399
870 بار تشکر شده در 560 پست
ارسال: #15
RE: ارتباط بین چند جدول
باز متوجه نشدم که دقیقا مشکل چی هست. نمونه اش رو تو همین بالا بحث کردیم. حالا یک رابطه دیگه هم اضافه شده. اتفاق خاصی ایجاد نشده؟؟
2011/08/20 01:15 AM
مشاهده سایت کاربر یافتن تمامی ارسال‌های این کاربر نقل قول این ارسال در پاسخ
786ali آفلاین
عضو نیمه حرفه ای
**

ارسال‌ها: 135
تاریخ عضویت: Jul 2011
رتبه: 2
تشکر: 197
80 بار تشکر شده در 42 پست
ارسال: #16
RE: ارتباط بین چند جدول
(2011/07/25 01:51 PM)saleh نوشته است:  خوب به ترتیب اشتباهاتتون رو میگم.

1- در تعریف ارتباطات مقادیر به صورت آرایه معرفی باید بشه.
کد PHP:
class Post extends AppModel {
var 
$name="Post";
var 
$hasAndBelongsToMany = array( 'Cat');
var 
$hasOne = array('User'); 

2- نام گذاری ها خیلی مهم هست فرضا Cats استباه هست.categories درسته . در نام گزاری فیلد ها از اسم چمع استفاده نکنید. البته الان مشکلی پیش نمیاد . اما بعد حتما به مشکل میخوری.

3- فیلد های که هدف تاریخ هست رو created ,updated بزارید. خود کیک این فیلد ها رو بروز میکنه

4- در ارتباط HABTM در حالت ساده بهتر است که یک مودل برای جدول واسته ایجاد شود.
کد PHP:
Cat.php
    
class Cat extends AppModel
    
{
        public 
$hasMany = array(
            
'PostCat'
        
);
    }
    
    
Post.php
    
class Post extends AppModel
    
{
        public 
$hasMany = array(
            
'PostCat'
        
);
    }

    
post_cat.php
    
class PostCat extends AppModel
    
{
        public 
$belongsTo = array(
            
'Post''Cat'
        
);    
    } 

این روش ساده هست . حالا امتحان کنید.

با این کار با پیغام خطای :
Error: Database table post_cats for model PostCat was not found.
مواجه می شویم
2011/09/26 01:00 PM
یافتن تمامی ارسال‌های این کاربر نقل قول این ارسال در پاسخ
saleh آفلاین
Administrator
*******

ارسال‌ها: 989
تاریخ عضویت: Dec 2009
رتبه: 12
تشکر: 399
870 بار تشکر شده در 560 پست
ارسال: #17
RE: ارتباط بین چند جدول
خوب شما جدوال post_cats رو که وظیفه ارتباط دو جدوال هست رو ایجاد نکرده اید.
2011/09/26 02:11 PM
مشاهده سایت کاربر یافتن تمامی ارسال‌های این کاربر نقل قول این ارسال در پاسخ
 تشکر شده توسط : 786ali
786ali آفلاین
عضو نیمه حرفه ای
**

ارسال‌ها: 135
تاریخ عضویت: Jul 2011
رتبه: 2
تشکر: 197
80 بار تشکر شده در 42 پست
ارسال: #18
RE: ارتباط بین چند جدول
(2011/09/26 02:11 PM)saleh نوشته است:  خوب شما جدوال post_cats رو که وظیفه ارتباط دو جدوال هست رو ایجاد نکرده اید.

با سپاس از پاسخ شما
اما این جدول با نام cats_posts قبلا موجود بود

گبریم این مشکل حل شده فکر کنید می خواهید پست های مربوط به یک موضوع (Category) خاص را نمایش بدهید و یکی از مشخصان هر پست موضوعاتی (categories) است که هر پست دارد (هر پست می تواند چند موضوع داشته باشد) .

این مورد را چگونه انجام میدهیم ؟
(آخرین تغییر در این ارسال: 2011/09/30 01:31 AM توسط 786ali.)
2011/09/29 11:56 PM
یافتن تمامی ارسال‌های این کاربر نقل قول این ارسال در پاسخ
saleh آفلاین
Administrator
*******

ارسال‌ها: 989
تاریخ عضویت: Dec 2009
رتبه: 12
تشکر: 399
870 بار تشکر شده در 560 پست
ارسال: #19
RE: ارتباط بین چند جدول
خوب من همیشه از jion استفاده می کنم. یا رابطه ها رو on the fly ایجاد می کنم. اما به روش بالا به این صورت امل می کنم

کد PHP:
$this->Post->PostCat->find('all' , array('candidtions' => array( 'PostCat.cat_id' => ) ) ); 
2011/09/30 08:03 AM
مشاهده سایت کاربر یافتن تمامی ارسال‌های این کاربر نقل قول این ارسال در پاسخ
 تشکر شده توسط : 786ali
786ali آفلاین
عضو نیمه حرفه ای
**

ارسال‌ها: 135
تاریخ عضویت: Jul 2011
رتبه: 2
تشکر: 197
80 بار تشکر شده در 42 پست
ارسال: #20
RE: ارتباط بین چند جدول
(2011/09/30 08:03 AM)saleh نوشته است:  خوب من همیشه از jion استفاده می کنم. یا رابطه ها رو on the fly ایجاد می کنم. اما به روش بالا به این صورت امل می کنم

کد PHP:
$this->Post->PostCat->find('all' , array('candidtions' => array( 'PostCat.cat_id' => ) ) ); 

همانگونه که قبلا اشاره شد جدول ما cats_posts نام دارد ، و در بقیه موارد به خوبی کار می کند ، آیا باید ابن نام به post_cat تغییر پیدا کند ؟
من از این کد در کنترل Post استفاده می کنم اما جواب نمی گیرم

کد PHP:
function cat($cids null) {
      
$this->Post->recursive 2;
$this->set('cats',$this->Post->CatsPost->find('all' , array('candidtions' => array( 'CatsPost.cat_id' => $cids ) ) ) ); 

یه جای کار اشتباهه (کلافه شدم یکی به دادم برسهAngry)
(آخرین تغییر در این ارسال: 2011/09/30 12:43 PM توسط 786ali.)
2011/09/30 12:27 PM
یافتن تمامی ارسال‌های این کاربر نقل قول این ارسال در پاسخ
ارسال موضوع  ارسال پاسخ 


پرش در انجمن: