راکت
حل شده

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

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();

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

ثبت پرسش جدید

پاسخ‌ها

33
مهدی شاه عباسیان
مهدی شاه عباسیان
@shahabbasian

تخصص: برنامه نویس

بهترین پاسخ
$request->user()->id;

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

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

$request->doctor

میگیرید.

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

مهدی شاه عباسیان
مهدی شاه عباسیان
@shahabbasian

تخصص: برنامه نویس

بله اینو متوجه شدم
ببینید واقعا سادست شما فقط باید ای دی کاربر از جدول Users رو در جدول Doctors ذخیره کنید اینجوری در یک ردیف هم عکس دکتر و هم ای دی کاربریش رو دارید
و در نتیجه میتونید با روش که خدمتون گفتم اسم دکتر رو نمایش بدید.

Armin Rahmati
Armin Rahmati
@arminrahmati999

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

شاید پاسخ شما همین‌جا باشد

مهدی شاه عباسیان
مهدی شاه عباسیان
@shahabbasian

تخصص: برنامه نویس

بسیار خب پس با همون حالت اول جدول رو آماده کنید اما هنگامی که دارید دکتر را در جدول دکتر ها اضافه میکنید ای دی همان کاربر که دکتر میشه را در user_id ذخیر کنید .

Armin Rahmati
Armin Rahmati
@arminrahmati999

@mehdi.shahabbasian
یعنی اینطوری؟

$data['user_id'] = $request->user()->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'] = $request->user()->id;

        Doctor::create(
            $data
        );
moha li
moha li
@mohaligateway

تخصص: توسعه دهنده لاراول و Vue

سلام وقت بخیر
اگه بیشتر کاربر هاتون دارای عکس هستند بهتره که در درون یک جدول قسمت imagesUrl رو قرار بدید و عکس ها را در درون اون بارگذاری کنید. اما اگر می خوایهد که به صورت جداگانه باشن باید یک ستون دیگه اضافه کنید به اسم user_id و اگر برای هر کاربر تعداد زیادی عکس دارید از one to many relationship استفاده کنید. اگر به صورت هر دکتر یک عکس هستش به صورت one to one relationship استفاده کنید.
@mehdi.shahabbasian
@arminrahmati999

Armin Rahmati
Armin Rahmati
@arminrahmati999

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

$table->id();
$table->foreignId('user_id')->constrained()->onDelete('CASCADE')->onUpdate('CASCADE');
$table->string('specialty');
$table->string('degree');
$table->string('image');
$table->timestamps();

من میخوام زمانی که کاربر میخواد نوبت بگیره، روزها و ساعت های حضور دکتر موردنظر بهش نشون داده بشه و هر کدومو میخواد انتخاب کنه، بعد زمانی که یه کاربر میاد از یه دکتر نوبت میگیره، دیگه اون روز و ساعت به کاربرای دیگه نشون داده نشه، برای انجام اینکار باید دیتابیس ساعت و روز رو چطور تعریف کنم؟
من خودم اومدم به صورت جداگانه تعریف کردم.

days

$table->id();
$table->string('days');
$table->timestamps();

hours

$table->id();
$table->string('hours');
$table->timestamps();

روشی که دارم میرم، درسته؟

مهدی شاه عباسیان
مهدی شاه عباسیان
@shahabbasian

تخصص: برنامه نویس

اول که فراموش نکن خود فیلد user id رو هم بساز

$table->id();
$table->unsignedBigInteger('user_id');
$table->foreignId('user_id')->constrained()->onDelete('CASCADE')->onUpdate('CASCADE');
$table->string('specialty');
$table->string('degree');
$table->string('image');
$table->timestamps();

و در رابطه با سوال
این دقیقا همون چالشیه که برنامه نویس باید باهاش دستو پنجه نرم کنه تا حلش کنه و برای همینم بهش میگن برنامه نویس. (این دیگه کار خودته)

اما در جهت راهنمایی با برنامت حرف بزن ببین اصن چی میخوای ازش
مثلا:

خب من یک سری ساعت و روز دارم
حالا یک نفر میاد و یک ساعت و روز خاصی رو رزرو میکنه
باشه حله
پس من در نظر میگیرم که هر ویزیت 30 دقیقه زمان لازم داره و از 30 دقیقه وقت رزرو شده این دکتر به بعد، باز زمان آزاده
باشه پس یک جدول میخوام تا ساعت ها و روز های رزرو شده رو توش بریزم
چون هم باید بدونم چه زمانی دکتر مشغوله و هم باید بدونم اون زمان ماله چی کیسه اصن
و در اخرم موقع نمایش زمان های باز برای رزرو اون زمان های رزرو شده به علاوه 30 دقیقه وقت بعدش رو نمایش نمیدم.

تموم شد و رفت
کد کردنش با خودت

Armin Rahmati
Armin Rahmati
@arminrahmati999

@mehdi.shahabbasian
بله کد زیر دقیقا همون user_id رو میسازه، فقط دستورش کمتره.

$table->foreignId('user_id')->constrained()->onDelete('CASCADE')->onUpdate('CASCADE');

تشکر بابت راهنمایی، حالا روش کار میکنم، باز نیاز به راهنمایی داشتم مزاحمتون میشم.

Armin Rahmati
Armin Rahmati
@arminrahmati999

@mehdi.shahabbasian
سلام مجدد.
واسه اینکه بتونم قسمت ثبت نوبت رو به درستی هندل کنم واسه ثبت دکتر اومدم 2 جدول دیگه اضافه کردم برای اینکه بدونم چه دکتری چه روزها و چه ساعت هایی حضور داره که به صورت زیر هستن:

Schema::create('day_doctor', function (Blueprint $table) {
            $table->id();
            $table->foreignId('doctor_id')->constrained()->onDelete('CASCADE')->onUpdate('CASCADE');
            $table->foreignId('day_id')->constrained()->onDelete('CASCADE')->onUpdate('CASCADE');
            $table->timestamps();
        });
Schema::create('doctor_hour', function (Blueprint $table) {
            $table->id();
            $table->foreignId('doctor_id')->constrained()->onDelete('CASCADE')->onUpdate('CASCADE');
            $table->foreignId('hour_id')->constrained()->onDelete('CASCADE')->onUpdate('CASCADE');
            $table->timestamps();
        });

مدل Doctor:

public function days() {
        return $this->belongsToMany(Day::class);
    }

    public function hours() {
        return $this->belongsToMany(Hour::class);
    }

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

من خودم به صورت زیر نوشتم:

<td>{{ $doctor->days()->days }}</td>

ولی ارور زیر رو بهم نمایش میده:

Undefined property: Illuminate\Database\Eloquent\Relations\BelongsToMany::$days
مهدی شاه عباسیان
مهدی شاه عباسیان
@shahabbasian

تخصص: برنامه نویس

 $doctor->days()->get()->all()

و باید توی حلقه پیمایش کنید

Armin Rahmati
Armin Rahmati
@arminrahmati999

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

htmlspecialchars() expects parameter 1 to be string, array given
مهدی شاه عباسیان
مهدی شاه عباسیان
@shahabbasian

تخصص: برنامه نویس

به نظرم شما دوره پروژه محور لاراول رو تهیه و کامل مشاهده کنید و همچنین تمرین بیشتر

شما نمیتونید آرایه یا آبجکت رو به صورت رشته echo کنید

لطفا اول قوانین اولیه و خروجی ها و کوئری هارو کامل آموزش ببینید و درک کنید و بعد خودتون رو به چالش بکشید .

صفحه 2 از 2

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

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