محسن
5 سال پیش توسط محسن مطرح شد
7 پاسخ

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

سلام.من 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

ثبت پرسش جدید
وحید
تخصص : Fullstack
@forughi.vahid 5 سال پیش مطرح شد
0

@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]);
    }
}

حسین شیری نژاد
تخصص : programmer
@hosseinshirinegad98 5 سال پیش مطرح شد
0

رابطه اینجا یک به چند اسن یعنی یک کشو 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 5 سال پیش مطرح شد
0

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


محسن بستان
تخصص : Senior Backend Developer
@mohsenbostan 5 سال پیش مطرح شد
0

@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


وحید
تخصص : Fullstack
@forughi.vahid 5 سال پیش مطرح شد
0

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


محسن
@mohsenmoradi1851 5 سال پیش مطرح شد
0

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


وحید
تخصص : Fullstack
@forughi.vahid 5 سال پیش مطرح شد
0

@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]);
    }
}

محسن
@mohsenmoradi1851 5 سال پیش مطرح شد
0

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

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

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


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

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