Armin Rahmati
4 سال پیش توسط Armin Rahmati مطرح شد
33 پاسخ

مایگریشن در لاراول

سلام دوستان.
من واسه 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();

حالا چطوری میشه فهمید که کدوم عکس مربوط به کدوم دکتر هست؟


ثبت پرسش جدید
مهدی شاه عباسیان
تخصص : برنامه نویس
@shahabbasian 4 سال پیش آپدیت شد
0
$request->user()->id;

ای دی کاربری رو برمیگردونه که این رکوئست رو ارسال کرده یا به عبارتی ای دی کاربری که لاگین هست الان که میشه همون فردی که دکتر را دکتر کرد .

شما یک فرمی دارید که به واسطه اون دارید یک کاربر رو انتخاب میکنید و میگید این کاربر دکتر بشه، پس ای دی همونو بهش میدید
مثلا من در نظر میگیرم شما یک سلکت باکس گذاشتید با name="doctor" و توش اپشن هایی دارید که مقدار value اونها ای دی کاربر ها هست که یکیش انتخاب میشه تا دکتر بشه پس مقدار userid رو از

$request->doctor

میگیرید.

اگر متوجه نشدید به ای دی تلگرام من پیام بدید تا به سیستمتون بیام
mehdi_shahabbasian


فرشید مرادی
تخصص : noob
@eniack 4 سال پیش مطرح شد
0

@arminrahmati999
سلام ، چرا فیلد image رو داخل جدول users تعریف نمیکنید؟!! چرا اصلا image باید یک جدول جداگانه باشه؟


Armin Rahmati
@arminrahmati999 4 سال پیش مطرح شد
0

@eniack
ببینید سه نوع کاربر دارم: ادمین، دکتر و بیمار.
من میخوام فقط دکترها عکس داشته باشن و اون عکس هم توسط ادمین انتخاب بشه.


فرشید مرادی
تخصص : noob
@eniack 4 سال پیش آپدیت شد
0

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

Armin Rahmati
@arminrahmati999 4 سال پیش مطرح شد
0

@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)

فرشید مرادی
تخصص : noob
@eniack 4 سال پیش مطرح شد
0

@arminrahmati999
خب این دو تا فیلد الزامی هست حتما قرار بدید داخل جدول users

$table->unsignedBigInteger('doctor_id');
            $table->foreign('doctor_id')->references('id')->on('doctors')->onDelete('cascade');

و با دستور rollback و migrate دوباره امتحان کنید


Armin Rahmati
@arminrahmati999 4 سال پیش مطرح شد
0

@eniack
این دو دستور با هم فرق ندارن، من این چیزی که شما گفتین هم تست کردم ولی مجدد همون ارور میاد.


مهدی شاه عباسیان
تخصص : برنامه نویس
@shahabbasian 4 سال پیش مطرح شد
0

جدول 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();

Armin Rahmati
@arminrahmati999 4 سال پیش مطرح شد
0

@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

اما تو ویو، من اسم اون کاربری که اومده دکتر رو ایجاد کرده رو میبینم، باید چیکار کنم که اسم اون دکترهایی که ثبت شدن رو ببینم؟
در واقع کدوم قسمت روابط اشتباه هست؟


مهدی شاه عباسیان
تخصص : برنامه نویس
@shahabbasian 4 سال پیش آپدیت شد
0
@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

Armin Rahmati
@arminrahmati999 4 سال پیش مطرح شد
0

@mehdi.shahabbasian
ارور زیر میاد:

Undefined property: Illuminate\Database\Eloquent\Relations\BelongsTo::$firstName

مهدی شاه عباسیان
تخصص : برنامه نویس
@shahabbasian 4 سال پیش مطرح شد
0

یک تغییر در کداهات تو پست بالا دادم

{{ $doctor->user()->get()->first()->firstName }} 

Armin Rahmati
@arminrahmati999 4 سال پیش مطرح شد
0

@mehdi.shahabbasian
بله دیدم.
الان اسم کاربری رو نمایش میده که این دکتر رو ایجاد کرده، من میخوام اسم اون دکتر رو نمایش بده.


مهدی شاه عباسیان
تخصص : برنامه نویس
@shahabbasian 4 سال پیش مطرح شد
0

به نظر من کلا تحلیل شما از پیاده سازی جداول کمی اشتباهه و گیج کننده. بهتره کمی به باز نویسیش فکر کنید با روش دیگر.

اما اگر میخواهید جدول دکتر هم به کسی که دکترش کرده وصل باشه و هم به خود دکتر

یک ارتباط دیگه مثل قبلی نیاز دارید که این بار تو جدول بگه این دکتر مال کدوم کاربر هست

و هنگام ثبت دکتر ای دی همون دکتر رو بزارید توی اون فیلد و در ادامه به همین روش ها بهش دسترسی داشته باشید


Armin Rahmati
@arminrahmati999 4 سال پیش مطرح شد
0

@mehdi.shahabbasian
خب با توجه به مواردی که عرض کردم جداول رو به چه صورت در نظر بگیرم؟


مهدی شاه عباسیان
تخصص : برنامه نویس
@shahabbasian 4 سال پیش مطرح شد
0

البته من از پروژه و نیاز شما اطلاعی ندارم

سوال پیش میاد آیا هر دکتر میتونه چندین تخصص داشته باشه ؟
آیا هر دکتر چندین روز متفاوت میتونه حضور داشته باشه ؟
و یا در چند نوبت ساعتی متفاوت ؟

اگر جواب این سوال ها بله هست به همین روش ادامه بدید
اما اگر هر کدام از اینها تنها برای هر دکتر یک مورد هست مثلا تخصص فقط یکی پس برای تخصص یک فیلد فقط در همون جدول دکتر در نظر بگیرید


Armin Rahmati
@arminrahmati999 4 سال پیش مطرح شد
0

@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

فرهاد محبی پور
تخصص : برنامه نویس backend
@farhad3d.mohebbi 4 سال پیش مطرح شد
0

باید توی جدول دومتون یه فیلد دیگه ایی اضافه کنید که یک ریلیشنی داره به جدول users و بعد از اون ایدی جدول users رو به این جدول موقع ثبتش پاس میدید. اینطوری میتونید متوجه بشید که هر دکتر چه عکس یا چه عکس هایی رو داره


Armin Rahmati
@arminrahmati999 4 سال پیش آپدیت شد
0

@farhad3d.mohebbi
متوجه نشدم، میشه دقیق بگین چی بنویسم؟
الان من میخوام نام، نام خانوادگی، تخصص، روز و ساعت دکتر رو نمایش بدم


مهدی شاه عباسیان
تخصص : برنامه نویس
@shahabbasian 4 سال پیش آپدیت شد
0

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

$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 }} 

Armin Rahmati
@arminrahmati999 4 سال پیش مطرح شد
0

@mehdi.shahabbasian
ببینید ادمین تو یه فرم میاد کاربر ایجاد میکنه که هم میتونه ادمین باشه و هم دکتر.
بعد تو یه فرم دیگه فقط اسم دکترها نمایش داده میشه و سپس موارد مربوط مثه تخصص و ... رو مشخص میکنه حالا تو این قسمت من میخوام اسم دکتر و ... رو نمایش بدم، متوجه منظورم شدین؟
اگر مزاحمتون نمیشم تا من شمارمو اینجا بذارم و شما پیام بدین تا از طریق انی دسک بهتر بتونین کاری که میخوام انجام بدم رو ببینین


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

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