با سلام خدمت همگی . من آموزش لاراول سایت روکسو رو دنبال میکنم و الان به قسمت تعریف آواتار برای هر کاربر رسیدم . بعد از مشاهده این قسمت یک سری سوالات برام پیش اومده که امیدوارم با کمک شما حل بشه.
طبق معمول دو مدل داریم به نام های 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 بیرون بکشیم یا عکس جدید ذخیره کنیم.
ممنون میشم همه دوستان راهنمایی بفرمایند و همچنین خود مهندس صالحی شاید برای این کار دلیلی داشتن که من بد متوجه شدم و هنوز مفاهیم رو یاد نگرفتم. آیا منطقی که توی ذهن من هست درسته ؟ از اینکه وقت میذارین تشکر میکنم
من دوره آموزش لاراول روکسو رو دیدم و این موردی که شما مطرح کردید رو می تونم براتون اینطوری توجیه کنم:
هر کاربر می تونه چندین تصویر در پایگاه داده ذخیره کنه که این تصاویر در جدول photos قرار می گیرند. اما وقتی یک جدول به نام users وجود داره که اسامی کاربران درون اون ذخیره میشن پس حتما باید یک رابطه در این جدول با جدول تصاویر یا همون photos وجود داشته باشه تا متوجه بشیم کدوم تصویر آپلود شده کاربر به عنوان عکس آواتار شناخته میشه!
یعنی اگر شما ستون photo_id رو درون جدول users قرار ندی، طبیعتا سیستم نمیتونه تشخیص بده که از بین هزاران عکس آپلود شده توسط کاربر کدومش برای آواتار استفاده میشه!
به جمع هزاران کاربر اینستاگرامی روکسو بپیوندید.