اذهب إلى المحتوى
  • 0

ربط العلاقات للارافل

Hanan Fahad2

السؤال

Recommended Posts

  • 0

يجب أن يكون لديكي حقل في الجدول الذي تريدين ربطه بالثاني فمثلاً إذا كان لديكي جدول users بهذا الشكل 

user
	id = integer
	name = varchar

وتريدين ربط كل Post يقوم بنشره في جدول posts بهذا الشكل 

user
	id = integer
	name = varchar
	user_id = integer - forign key

فكل عملية نشر لمنشور تقومين بتخزين رقم اليوزر الذي قام بنشر هذا المنشور بحقل user_id في جدول posts. و إذا أردنا تطبيق ذلك في لارافل 

Schema::create('users', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->unsignedInteger('id_employe');
            $table->rememberToken();
            $table->timestamps();

            $table->foreign('id_employe')
                    ->references('id')
                    ->on('employes')
                    ->onDelete('cascade');
        });
Schema::create('employes', function (Blueprint $table) {
  $table->increments('id');
  $table->string('personnel_number')->nullable();
  $table->string('name')->nullable();
  $table->timestamps();
});

فقمنا باستخدام 

$table->foreign('id_employe')
                    ->references('id')
                    ->on('employes')
                    ->onDelete('cascade');

لربط جدول employes بجدول users عن طريق foreign key

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 2 دقائق مضت قال hanan fahad11:

ابغا الكود لارافل مش شرح انا فاهمه بس ضيعت وين قريت المعلومه بحسوب بدوره 

ممكن تنظري للإجابة السابقة مرة أخرى, حدث خطأ معي و لم يظهر كامل الإجابة فقمت بتعديلها مرة أخرى. 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

يوفّر Laravel دعم لإنشاء قيود المفاتيح الثانوية، على سبيل المثال لنفرض أننا نريد إضافة مفتاح ثانوي على مُستوى جدول مقالات مرجعه هو المفتاح الأولي في جدول المُستخدمين فإننا نعرّف عمود user_id على جدول posts الذي يشير إلى عمود id في جدول users بهذا الشكل:

Schema::table('posts', function (Blueprint $table) {

  // ..

  $table->unsignedBigInteger('user_id');

  $table->foreign('user_id')->references('id')->on('users');
});

ملاحظة يجب أن يكون المفتاح الثانوي و المفتاح الأولي الذي يشير إليه من نفس النوع و في الإصدارات الأخيرة أصبح نوع المفتاح الأولي المستخدم من طرف لارافل هو BigInteger بعكس الإصدارات الأقدم كان Integer.

يمكنك تحديد الإجراء المطلوب أيضًا لخصائص "on delete" و"on update" من القيد:

$table->foreign('user_id')
     ->references('id')->on('users')
     ->onDelete('cascade');

في الإصدار الثامن تم إختصار السطرين أي تعريف الحقل و جعله كمفتاح ثانوي و إضافة القيد بالتالي:

Schema::table('posts', function (Blueprint $table) {
  $table->foreignId('user_id')->constrained();
});

حيث أن التابع foreignId هو إختصار ل unsignedBigInteger  بينما constrained هو تابع يُستخدم لتحديد الجدول و العمود الذي سيتم الإشارة إليه. إذا كنت تتبع التسمية user_id فلارافل ستُحدد الجدول المشار إليه من إسم الحقل على أنه users لكن إن لم تتبع العُرف في التسمية و لنفرض أنك أردت تسمية الحقل ب created_by فتحتاج إلى تمرير إسم الجدول كمعامل للتابع constrained بهذا الشكل:

Schema::table('posts', function (Blueprint $table) {
  $table->foreignId('created_by')->constrained("users");
});
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 5 دقائق مضت قال hanan fahad11:

لقطة الشاشة 2021-05-25 085839.png

الخطأ المُرفق ليس لنفس الملف بل لمشروع آخر، أيضاً هل بإمكانك توضيح الكيفية التي تقومين بها بإضافة المفتاح الثانوي أعتقد أنك تتبعين طريقة خاطئة.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 1 دقيقة مضت قال hanan fahad11:

سوري هذا هو 

السبب أنك تقومين بالإشارة إلى جدول لم يتم إنشاؤه بعد فملف التهجير genders موجود في الترتيب بعد ملف people فلحل المُشكل قومي بتغيير إسم ملف التهجير لجدول genders ليكون قبل people مثلاً بهذا الإسم:

2021_06_01_095234_create_genders_table.php

بعد ذلك في ملف people قومي بتغيير:

$table->increments('id');

إلى:

$table->id();

حتى يتم إستخدام نفس النوع لحقول المفاتيح الأولية و حتى لا تحدث أخطاء مستقبلية بسبب النوع.

بعد ذلك يُمكنك إعادة تنفيذ أمر التهجير:

php artisan migrate:fresh
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

اذا عندي جدول وسيط وعندي فيه مفتاح رئيسي اثنين كيف اعملها في رافل بالاكواد 

مثلا الجدول الوسيط 

رقم الطالب ورقم التخصص كل الاثنين مفتاح رئيسي كجدول وسيط علاقه many to many 

 كيف اسويها بالارافل 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 5 ساعات قال hanan fahad11:

اذا عندي جدول وسيط وعندي فيه مفتاح رئيسي اثنين كيف اعملها في رافل بالاكواد 

مثلا الجدول الوسيط 

رقم الطالب ورقم التخصص كل الاثنين مفتاح رئيسي كجدول وسيط علاقه many to many 

 كيف اسويها بالارافل 

يمكن تحقيقك ذلك من خلال علاقة belongsToMany بوضعها في كلا النوذجين Model الذين يحققان many to many:

مثلا لدينا قاعدة بيانات فيها مستخدمين و كل مستخدم يمكن أن يكون له عدة أدوار، والدور الواحد متاج لعدة مستخدمين

فيكون نموذج المستخدم:

<?php

namespace App\Models;
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    public function roles()
    {
        return $this->belongsToMany(Role::class);
    }
}

ونموذج الدور:

<?php

namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Role extends Model
{
    public function users()
    {
        return $this->belongsToMany(User::class);
    }
}

حيث كما تلاحظين قمنا بوضع دالة تقوم ببناء العلاقة المطلوبة belongsToMany في كل من النموذجين

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

طيب في migtation كيف اسوي الجداول عشان تفهم قاعده البيانات ان هذا الجدولين مفتاحين اساسيين  كلهم يعني اذا واحد قلنا forign key 

طيب الاثنين مفتاحين اساسيين كيف  اخليهم 

$table-> id

يعطيني مفتاح واحد اساسي ابغا الاثنين مفاتيح اساسيه 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 14 ساعات قال hanan fahad11:

طيب في migtation كيف اسوي الجداول عشان تفهم قاعده البيانات ان هذا الجدولين مفتاحين اساسيين  كلهم يعني اذا واحد قلنا forign key 

طيب الاثنين مفتاحين اساسيين كيف  اخليهم 

$table-> id

يعطيني مفتاح واحد اساسي ابغا الاثنين مفاتيح اساسيه 

يمكنك إستخدام التابع primary لعمل composite primary key

$table->bigInteger('user_id')->unsigned();
$table->bigInteger('permission_id')->unsigned();

$table->primary(['user_id','permission_id']);

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...