سلام دوستان.
من واسه users ها جدول زیر رو دارم.
$table->id();
$table->string('firstName');
$table->string('lastName');
$table->string('mobile')->unique();
$table->string('idNumber')->unique();
$table->string('role')->default('user');
$table->string('password');
$table->timestamps();
ادمین این قابلیت رو داره که بیاد دکتر اضافه کنه و میخوام واسه هر دکتر یه عکس هم آپلود کنه و برای ذخیره عکس اومدم یه جدول دیگه به صورت زیر تعریف کردم:
$table->id();
$table->string('image');
$table->timestamps();
حالا چطوری میشه فهمید که کدوم عکس مربوط به کدوم دکتر هست؟
$request->user()->id;
ای دی کاربری رو برمیگردونه که این رکوئست رو ارسال کرده یا به عبارتی ای دی کاربری که لاگین هست الان که میشه همون فردی که دکتر را دکتر کرد .
شما یک فرمی دارید که به واسطه اون دارید یک کاربر رو انتخاب میکنید و میگید این کاربر دکتر بشه، پس ای دی همونو بهش میدید
مثلا من در نظر میگیرم شما یک سلکت باکس گذاشتید با name="doctor" و توش اپشن هایی دارید که مقدار value اونها ای دی کاربر ها هست که یکیش انتخاب میشه تا دکتر بشه پس مقدار userid رو از
$request->doctor
میگیرید.
اگر متوجه نشدید به ای دی تلگرام من پیام بدید تا به سیستمتون بیام
mehdi_shahabbasian
@arminrahmati999
سلام ، چرا فیلد image رو داخل جدول users تعریف نمیکنید؟!! چرا اصلا image باید یک جدول جداگانه باشه؟
@eniack
ببینید سه نوع کاربر دارم: ادمین، دکتر و بیمار.
من میخوام فقط دکترها عکس داشته باشن و اون عکس هم توسط ادمین انتخاب بشه.
@arminrahmati999
بر فرض اینکه اسم جدول شما images هست ، کد زیر رو داخل مایگریشن users بنویسید
$table->unsignedBigInteger('image_id');
$table->foreign('image_id')->references('id')->on('images')->onDelete('cascade');
و داخل مدل users این کد رو بنویسید
public function image()
{
return $this->hasOne(Image::class);
}
و مدل image
public function user(){
return $this->belongsTo(User::class);
}
@eniack
جدول users
$table->id();
$table->foreignId('doctor_id')->constrained()->onDelete('CASCADE')->onUpdate('CASCADE');
$table->string('firstName');
$table->string('lastName');
$table->string('mobile')->unique();
$table->string('idNumber')->unique();
$table->string('role')->default('user');
$table->string('password');
$table->timestamps();
جدول doctors
$table->id();
$table->string('image');
$table->timestamps();
ارور میده:
SQLSTATE[HY000]: General error: 1005 Can't create table `doctor_reservation`.`#sql-c54_119` (errno: 150 "Foreign key constraint is incorrectly formed") (SQL: alter table `users` add constraint `users_doctor_id_foreign` foreign key (`doctor_id`) references `doctors` (`id`) on delete CASCADE on update CASCADE)
@arminrahmati999
خب این دو تا فیلد الزامی هست حتما قرار بدید داخل جدول users
$table->unsignedBigInteger('doctor_id');
$table->foreign('doctor_id')->references('id')->on('doctors')->onDelete('cascade');
و با دستور rollback و migrate دوباره امتحان کنید
@eniack
این دو دستور با هم فرق ندارن، من این چیزی که شما گفتین هم تست کردم ولی مجدد همون ارور میاد.
جدول users
$table->id();
$table->string('firstName');
$table->string('lastName');
$table->string('mobile')->unique();
$table->string('idNumber')->unique();
$table->string('role')->default('user');
$table->string('password');
$table->timestamps();
جدول doctors
$table->id();
$table->unsignedBigInteger('user_id');
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade')->onUpdate('cascade');
$table->string('image');
$table->timestamps();
@mehdi.shahabbasian
این کارو انجام دادم و بدون مشکل جداول ساخته میشه.
حالا فرض کنید ادمین چندتا کاربر با عنوان دکتر ایجاد کرده، بعد من اومدم یه قسمت دیگه در نظر گرفتم که داخل اون فرم لیست دکترها داخل یه select نمایش داده بشه و ادمین بتونه یکی رو انتخاب کنه و در فیلدهای دیگه این فرم بتونه تخصص دکتر، روز حضور، ساعت حضور رو انتخاب کنه که واسه تخصص، روز و ساعت اومدم 3تا جدول جدا درنظر گرفتم. به صورت زیر:
جدول تخصص:
$table->id();
$table->string('specialty');
$table->timestamps();
جدول روز:
$table->id();
$table->string('days');
$table->timestamps();
جدول ساعت:
$table->id();
$table->string('hours');
$table->timestamps();
در واقع تو فرم های جداگانه ادمین میاد انواع تخصص ها، روزها و ساعت ها رو اضافه میکنه و تو فرم ثبت دکتر اون لیست ها نمایش داده میشه و دکتر ثبت میشه.
حالا من دکتر رو ثبت میکنم ولی مشکل من موقع نمایش اطلاعات اون دکتراس که چطور نمایش بدم اونارو.
مدل Doctor:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Doctor extends Model
{
use HasFactory;
protected $fillable = ['image', 'user_id'];
public function user() {
return $this->belongsTo(User::class);
}
}
کنترلر Doctor:
public function index()
{
$doctors = Doctor::paginate();
return view('Panel.doctors.index', compact('doctors'));
}
ویو doctor:
@foreach($doctors as $key => $doctor)
<tbody>
<tr>
<td>{{ $key + 1 }}</td>
<td>{{ $doctor->user->firstName }} {{ $doctor->user->lastName }}</td>
</tr>
</tbody>
@endforeach
اما تو ویو، من اسم اون کاربری که اومده دکتر رو ایجاد کرده رو میبینم، باید چیکار کنم که اسم اون دکترهایی که ثبت شدن رو ببینم؟
در واقع کدوم قسمت روابط اشتباه هست؟
@php
$i = 1;
@endphp
@foreach($doctors as $doctor)
<tbody>
<tr>
<td>{{ $i++ }}</td>
<td>{{ $doctor->user()->get()->first()->firstName }} {{ $doctor->user()->get()->first()->lastName }}</td>
</tr>
</tbody>
@endforeach
@mehdi.shahabbasian
ارور زیر میاد:
Undefined property: Illuminate\Database\Eloquent\Relations\BelongsTo::$firstName
@mehdi.shahabbasian
بله دیدم.
الان اسم کاربری رو نمایش میده که این دکتر رو ایجاد کرده، من میخوام اسم اون دکتر رو نمایش بده.
به نظر من کلا تحلیل شما از پیاده سازی جداول کمی اشتباهه و گیج کننده. بهتره کمی به باز نویسیش فکر کنید با روش دیگر.
اما اگر میخواهید جدول دکتر هم به کسی که دکترش کرده وصل باشه و هم به خود دکتر
یک ارتباط دیگه مثل قبلی نیاز دارید که این بار تو جدول بگه این دکتر مال کدوم کاربر هست
و هنگام ثبت دکتر ای دی همون دکتر رو بزارید توی اون فیلد و در ادامه به همین روش ها بهش دسترسی داشته باشید
البته من از پروژه و نیاز شما اطلاعی ندارم
سوال پیش میاد آیا هر دکتر میتونه چندین تخصص داشته باشه ؟
آیا هر دکتر چندین روز متفاوت میتونه حضور داشته باشه ؟
و یا در چند نوبت ساعتی متفاوت ؟
اگر جواب این سوال ها بله هست به همین روش ادامه بدید
اما اگر هر کدام از اینها تنها برای هر دکتر یک مورد هست مثلا تخصص فقط یکی پس برای تخصص یک فیلد فقط در همون جدول دکتر در نظر بگیرید
@mehdi.shahabbasian
بله دقیقا همین چیزایی که فرمودین رو میخوام انجام بدم به همین خاطر جداول جدا تعریف کردم.
الان من اون جدول واسط رو به صورت زیر تعریف کردم:
Schema::create('doctor_user', function (Blueprint $table) {
$table->id();
$table->foreignId('doctor_id')->constrained()->onDelete('CASCADE')->onUpdate('CASCADE');
$table->foreignId('user_id')->constrained()->onDelete('CASCADE')->onUpdate('CASCADE');
$table->timestamps();
});
قسمت کنترلر هم به صورت زیر نوشتم:
public function store(CreateDoctorRequest $request)
{
$firstNameIds = User::where('firstName', $request->firstName)->get()->pluck('id');
$lastNameIds = User::where('lastName', $request->lastName)->get()->pluck('id');
$specialIds = Specialty::where('specialty', $request->specialty)->get()->pluck('id');
$dayIds = Day::where('days', $request->days)->get()->pluck('id');
$hourIds = Hour::where('hours', $request->hours)->get()->pluck('id');
$file = $request->file('image');
$file_name = $file->getClientOriginalName();
$file->storeAs('images/image', $file_name, 'public_files');
$data = $request->validated();
$data['image'] = $file_name;
$data['user_id'] = auth()->user()->id;
$doctor = Doctor::create(
$data
);
$doctor->user()->sync($firstNameIds);
$doctor->user()->sync($lastNameIds);
$doctor->specialty()->sync($specialIds);
$doctor->day()->sync($dayIds);
$doctor->hour()->sync($hourIds);
session()->flash('status', 'دکتر با موفقیت ایجاد شد');
return redirect()->route('doctors.index');
}
مدل User هم به صورت زیر:
public function user() {
return $this->belongsToMany(User::class);
}
public function specialty() {
return $this->belongsToMany(Specialty::class);
}
public function day() {
return $this->belongsToMany(Day::class);
}
public function hour() {
return $this->belongsToMany(Hour::class);
}
ویو هم به همون صورت که گفتین ولی ارور زیر میاد.
Trying to get property 'firstName' of non-object
باید توی جدول دومتون یه فیلد دیگه ایی اضافه کنید که یک ریلیشنی داره به جدول users و بعد از اون ایدی جدول users رو به این جدول موقع ثبتش پاس میدید. اینطوری میتونید متوجه بشید که هر دکتر چه عکس یا چه عکس هایی رو داره
@farhad3d.mohebbi
متوجه نشدم، میشه دقیق بگین چی بنویسم؟
الان من میخوام نام، نام خانوادگی، تخصص، روز و ساعت دکتر رو نمایش بدم
برای نمایش نام دکتر نیازی به جدول واسط نبود
جدول دکتر میشه جدول زیر:
$table->id();
$table->unsignedBigInteger('user_id');
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade')->onUpdate('cascade');
$table->unsignedBigInteger('created_by');
$table->foreign('created_by')->references('id')->on('users')->onDelete('cascade')->onUpdate('cascade');
$table->string('image');
$table->timestamps();
مدل دکتر:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Doctor extends Model
{
use HasFactory;
protected $fillable = ['image', 'user_id', 'created_by'];
public function user() {
return $this->belongsTo(User::class);
}
public function createdBy() {
return $this->belongsTo(User::class, 'id', 'created_by');
}
}
هنگام ساخت دکتر
ای دی کاربر که دکتر هست و میریزد تو user_id
و ای دی کسی که دکترش کرده رو میریزد تو created_by
و برای نمایش نام دکتر:
{{ $doctor->user()->get()->first()->firstName }}
نمایش کسی که دکتر را دکتر کرد:
{{ $doctor->createdBy()->get()->first()->firstName }}
@mehdi.shahabbasian
ببینید ادمین تو یه فرم میاد کاربر ایجاد میکنه که هم میتونه ادمین باشه و هم دکتر.
بعد تو یه فرم دیگه فقط اسم دکترها نمایش داده میشه و سپس موارد مربوط مثه تخصص و ... رو مشخص میکنه حالا تو این قسمت من میخوام اسم دکتر و ... رو نمایش بدم، متوجه منظورم شدین؟
اگر مزاحمتون نمیشم تا من شمارمو اینجا بذارم و شما پیام بدین تا از طریق انی دسک بهتر بتونین کاری که میخوام انجام بدم رو ببینین
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟