سلام.من 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
مثل اینکه خود لاراول برای بیشتر از 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]);
}
}
رابطه اینجا یک به چند اسن یعنی یک کشو 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);
}
@hosseinshirinegad98
ممنون از پاسخ شما...نمیخوام فیلد country_id رو به جدول پست اضافه کنم..میخوام از طریق user_id به جدول های بالایی برسم
@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
@mohsenmoradi1851
میتونید از رابطه has many through لاراول استفاده کنید ، فرض کنید هر کشور چند تا شهر داره ، هر شهر چند تا کاربر داره ، هر کاربر چند تا پست داره ، شما میتونید یک رابطه has many trough بین کشور و پست برقرار کنید و به تمام پست های یک کشور دسترسی داشته باشید.
@forughi.vahid
این رابطه رو بین ۳ تا جدول اکی کردم ولی برای ۴ تا جدول نمیدونم به چه صورت میشه..لینکی دارید برای مثال؟
@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]);
}
}
ممنون از پاسخ همگی..در ادامه سوال دیگه ای برام پیش اومد که شاید ساده باشه اما الان حضور ذهن ندارم برا حلش..لطفا کمک کنید.
جدول های من به صورتی که بالا اشاره کردم با هم در ارتباط هستن...من میخوام تعداد پست هایی که مربوط به شهر tehran و mashhad هست رو بگیرم(برای مثال البته!)...اگر بخوام فقط پست های یک شهر رو بگیرم مشکلی نیست و راحت برمیگردونه ولی با احتساب چند شهر به مشکل میخورم.کوئری بنده اینطوری میشه ولی جواب نمیده برام:
$posts=City::where([[name,'tehran'],[name,'mashhad']]->posts()->get()
رابطه ها ایجاد شده و من میخوام با یک کوئری به جواب برسم و از حلقه استفاده نکنم
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟