راکت
حل شده

ایجاد رابطه بین 4 جدول

7 پاسخ

سلام.من 4 تا جدول دارم و هر کدوم والد جدول زیرین هستن:

table countries:
id
name

table cities:
id
name
country_id

table users: 
id
name
city_id

table posts:
id
name
user_id

میخوام رابطه بین جدول countries و posts ایجاد کنم یعنی بتونم هم از country به post برسم و هم از post به country.مثلا:

$country=Country::find(1);
return $country->posts

و یا

$post=Post::find(1);
return $post->country
محسن
محسن
@mohsenmoradi1851
ثبت پرسش جدید

پاسخ‌ها

7
وحید
وحید
@forughi.vahid

تخصص: Fullstack

بهترین پاسخ

@mohsenmoradi1851
مثل اینکه خود لاراول برای بیشتر از 3 جواب نمیده ، میتونید توی رابطه از join استفاده کنید ولی خیلی اصولی نیست این کار ،
میتونید از این پکیج استفاده کنید
https://github.com/staudenmeir/eloquent-has-many-deep

class Country extends Model {
    use \Staudenmeir\EloquentHasManyDeep\HasRelationships;

    public function posts() {
        return $this->hasManyDeep(Post::class, [City::class, User::class]);
    }
}
حسین شیری نژاد
حسین شیری نژاد
@hosseinshirinegad98

تخصص: programmer

رابطه اینجا یک به چند اسن یعنی یک کشو n تا پست می تونه داشته باشه
و هر پست هم متعلق به یک کشور است نه چند تا کشور. مثل همون رابطه کاربر با پست
این میشه فیلدای جدول posts

table posts:
id
name
user_id
country_id

داخل کلاس کشور متد زیر رو اضافه کن

public function posts(){
    return $this->hasMany(Post::class);
}

داخل کلاس POst
متد زیر رو اضافه کن

public function country(){
    return $this->belongsTo(Country::class);
}

@mohsenmoradi1851

محسن
محسن
@mohsenmoradi1851

@hosseinshirinegad98
ممنون از پاسخ شما...نمیخوام فیلد country_id رو به جدول پست اضافه کنم..میخوام از طریق user_id به جدول های بالایی برسم

شاید پاسخ شما همین‌جا باشد

محسن بستان
محسن بستان
@mohsenbostan

تخصص: Senior Backend Developer

@mohsenmoradi1851
سلام.
رابطه ها باید به صورت زیر باشه:

// Post Model
public function user()
{
    return this->belongsTo('App\User');
}

// User Model
public function posts()
{
    return this->hasMany('App\Post');
}

public function city()
{
    return this->belongsTo('App\City');
}

// City Model
public function users()
{
    return this->hasMany('App\User');
}

public function country()
{
    return this->belongsTo('App\Country');
}

// Country Model
public function cities()
{
    return this->hasMany('App\City');
}

در نهایت برای دستیابی برای مثال از country به post و یا برعکس، باید از متد whereHas استفاده کنید که در لینک زیر نمونه ش وجود داره :
https://laravel.com/docs/7.x/eloquent-relationships#querying-relationship-existence

وحید
وحید
@forughi.vahid

تخصص: Fullstack

@mohsenmoradi1851
میتونید از رابطه has many through لاراول استفاده کنید ، فرض کنید هر کشور چند تا شهر داره ، هر شهر چند تا کاربر داره ، هر کاربر چند تا پست داره ، شما میتونید یک رابطه has many trough بین کشور و پست برقرار کنید و به تمام پست های یک کشور دسترسی داشته باشید.

محسن
محسن
@mohsenmoradi1851

@forughi.vahid
این رابطه رو بین ۳ تا جدول اکی کردم ولی برای ۴ تا جدول نمیدونم به چه صورت میشه..لینکی دارید برای مثال؟

محسن
محسن
@mohsenmoradi1851

ممنون از پاسخ همگی..در ادامه سوال دیگه ای برام پیش اومد که شاید ساده باشه اما الان حضور ذهن ندارم برا حلش..لطفا کمک کنید.
جدول های من به صورتی که بالا اشاره کردم با هم در ارتباط هستن...من میخوام تعداد پست هایی که مربوط به شهر tehran و mashhad هست رو بگیرم(برای مثال البته!)...اگر بخوام فقط پست های یک شهر رو بگیرم مشکلی نیست و راحت برمیگردونه ولی با احتساب چند شهر به مشکل میخورم.کوئری بنده اینطوری میشه ولی جواب نمیده برام:

$posts=City::where([[name,'tehran'],[name,'mashhad']]->posts()->get()

رابطه ها ایجاد شده و من میخوام با یک کوئری به جواب برسم و از حلقه استفاده نکنم

برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام