سوال بپرسید
0

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

سوال بپرسید

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

طبق معمول دو مدل داریم به نام های User و Photo که بصورت زیر هستند : 

مدل یوزر : 

<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Http\Request;

class User extends Authenticatable
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];


    public function roles()
    {
        return $this->belongsToMany(Role::class);
    }
    public function photos()
    {
        return $this->hasMany(Photo::class);
    }
   
}

و مدل photo : 

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Photo extends Model
{
    public function user()
    {
        return $this->belongsTo(User::class);
    }
}

ساختار دیتابیس داخل آموزش اینطوری هستش که جدول users فیلدی به نام photo_id در خودش داره و همچنین جدول photos علاوه بر آدرس و نام عکس فیلد user_id داره. توی آموزش بعد از ایجاد کاربر توسط مدیر (چون این بخش مربوط به اضافه کردن کاربر بصورت دستی توسط ادمین هست) برای نمایش آواتار در لیست کاربران یک فانکشن دیگه تعریف میشه داخل مدل User به نام photo که در نهایت مدل User به این صورت میشه : 

<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Http\Request;

class User extends Authenticatable
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];


    public function roles()
    {
        return $this->belongsToMany(Role::class);
    }
    
    public function photos()
    {
        return $this->hasMany(Photo::class);
    }
    public function photo()
    {
        return $this->belongsTo(Photo::class);
    }
   
}

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

الان سوال من این هست که مگر با متد photos در مدل User و متد user داخل مدل Photo نمیتونیم رابطه یک به چند رو برقرار کنیم تا هم عکس ذخیره بشه هم نمایش داده بشه ؟ یعنی بر اساس منطقی که من تحلیل میکنم توی ذهنم ما اصلا به فیلد photo_id در جدول users نیازی نداریم و فقط با فیلد user_id در جدول photos میتونیم رابطه رو برقرار کنیم و موقع ذخیره یا نمایش عکس با تابع photos بتونیم عکس کاربر رو از جدول photos بوسیله user_id بیرون بکشیم یا عکس جدید ذخیره کنیم.

ممنون میشم همه دوستان راهنمایی بفرمایند و همچنین خود مهندس صالحی شاید برای این کار دلیلی داشتن که من بد متوجه شدم و هنوز مفاهیم رو یاد نگرفتم. آیا منطقی که توی ذهن من هست درسته ؟ از اینکه وقت میذارین تشکر میکنم 

برچسب ها:
گزارش سوال
پرسیده شده در
آمار بازدید: 526

1 پاسخ

1

من دوره آموزش لاراول روکسو رو دیدم و این موردی که شما مطرح کردید رو می تونم براتون اینطوری توجیه کنم:

هر کاربر می تونه چندین تصویر در پایگاه داده ذخیره کنه که این تصاویر در جدول photos قرار می گیرند. اما وقتی یک جدول به نام users وجود داره که اسامی کاربران درون اون ذخیره میشن پس حتما باید یک رابطه در این جدول با جدول تصاویر یا همون photos وجود داشته باشه تا متوجه بشیم کدوم تصویر آپلود شده کاربر به عنوان عکس آواتار شناخته میشه!

یعنی اگر شما ستون photo_id رو درون جدول users قرار ندی، طبیعتا سیستم نمیتونه تشخیص بده که از بین هزاران عکس آپلود شده توسط کاربر کدومش برای آواتار استفاده میشه!

pirniak (234)
بیش از ۱ سال عضویت در روکسودارای ۲۰۰ کارماارسال کننده پاسخ با ۱۰ رایدارای سوال با ۱۰ رأی
سلام . خیلی ممنونم بخاطر راهنماییتون همین الان پیاده سازی کردم سناریوی خودمو و الان با تمام وجود چیزی که گفتین رو لمس کردم !! :D الان برای هر کاربر بخوام عکس نمایش بدم چندین عکس هست که بقول شما نمیشه فهمید کدومم باید برای آواتار باشه . راهی که به ذهنم رسید این بود که آخرین عکس آپلود شده رو بگیرم و نمایش بدم اما بعدش متوجه شدم اگر مثلا بخوام گالری بذارم که کاربر عکسش رو از بین تمام عکس هایی که آپلود کرده انتخاب کنه مثل تلگرام بازم به مشکل میخورم چون اونموقع دیگه ممکنه صرفا آخرین عکس آواتار مورد نظر نباشه!! ( اینو کاملا درک کردم مرسی بخاطر راهنمایی شفافتون ). اما الان سوال دیگه ای که دارم اینه که : نباید در لاراول همیشه روابط رو رفت و برگشتی تعریف کرد ؟ یعنی همونجایی که عرض کردم داخل مدل user متد photo میذاریم و رابطشو belongsTo نسبت به مدل photo میذاریم اینطوری نیست که حتما باید بریم و داخل مدل photo رابطه برعکسشو تعریف کنیم (مثلا داخل مدل photo متد hasOne نسبت به مدل User تعریف کنیم )؟ از لحاظ استاندارد بودنش منظورم هست . بازم مرسی که وقت میذارین – sobhandt در
خواهش می کنم. خوشحالم که مشکل تون برطرف شده. خیر نیازی نیست که شما حتما یک رابطه دو طرفه رو داخل مدل بنویسید. در واقع شما زمانی رابطه رو تعریف می کنید که بهش احتیاج داشته باشید. اگر به پاسخ خودتون رسیدید روی علامت تیک در کنار پاسخ بنده کلیک کنید تا بقیه دوستان به پاسخ درست دسترسی داشته باشند – pirniak در