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

السؤال

نشر

السلام عليكم,

أريد بناء تطبيق دردشة بسيط بحيث يتواصل كل مستخدم مع الآخر في غرفة خاصة واجهة مشكلة في إنشاء  new conversation تضم مستخدمين , لتخطيط قاعدة البيانات عندنا فكرت فيما يلي :

* كل مستخدم يمكن أن يكون له العديد من الغرف الخاصة (محادثات) و كل محادثة أيضا تضم أكثر من مستخدم العلاقة هنا **كثير لكثير**

* كل مستخدم له العديد من الرسائل بينما كل رسالة تنتمي لمستخدم واحد    العلاقة هنا ** واحد لكثير **  

* العلاقة بين الغرف (المحادثات) و الرسائل هي كل رسالة تنتمي لمحادثة واحدة بينما كل محادثة يمكن ان يكون لديها العديد من الرسائل العلاقة هنا  ** واحد لكثير **  

الجداول :

** جدول المستخدمين :

        Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('email')->unique();
            $table->string('phone');
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->foreignId('current_team_id')->nullable();
            $table->string('profile_photo_path', 2048)->nullable();
            $table->timestamps();
            
        });

** جدول الرسائل 

        Schema::create('messages', function (Blueprint $table) {
            $table->id();
            $table->text('message');  

            $table->foreignId('user_id')
            ->constrained();

            $table->timestamps();
        });

**جدول المحادثات 

        Schema::create('conversitions', function (Blueprint $table) {
            $table->id();
            $table->timestamps();
        });

** جدول كسر العلاقة كثير لكثير بين المحادثات و المستخدمين 

        Schema::create('conversations_users', function (Blueprint $table) {
            $table->id();

            
            $table->foreignId('conversation_id')
            ->constrained();

            $table->foreignId('user_id')
            ->constrained();

            $table->timestamps();
        });

وستكون الدوال في النمادج على النحو التالي :

class User extends Eloquent
{
    public function conversations()
    {
        return $this->belongsToMany('Conversation');
    }

    public function messages()
    {
        return $this->hasMany('Message');
    }
}
class Message extends Eloquent
{
    public function user()
    {
        return $this->belongsTo('User');
    }

    public function conversation()
    {
        return $this->belongsTo('Conversation');
    }
}
class Conversation extends Eloquent
{
    public function messages()
    {
        return $this->hasMany('Message');
    }

    public function users()
    {
        return $this->belongsToMany('User');
    }
}

 

Recommended Posts

  • 0
نشر

فكرة المحادثات الخاصة اساسا هي في انها محادثات او غرف عامة يشترك بها مستخدمان فقط.

فان كنت تعرف جدولا خاصا بالمحادثات يمكنك اضافة عمودين يميزان هذين المستخدمين له. وليكن user_one و user_two .

Schema::create('conversitions', function (Blueprint $table) {
            $table->id();
            
            $table->foreign('user_one')->references('id')->on('users')->onDelete('cascade');
            $table->foreign('user_two')->references('id')->on('users')->onDelete('cascade');
            
            
            $table->unique([
                'user_one',
                'user_two'
            ]);

            $table->timestamps();
});

لاحظ انه يجب ان تكون الثنائية user_one و user_two فريدة فنحن لا نريد ان ننشئ اكثر من محادثة خاصة لكل مستخدمين. رغم هذا يجب تقييد عملية انشاء محادثة بشرط. لأنه ان كانت الثنائية:

[
    'user_one' => 1,
    'user_two' => 2
]

منشئة بالفعل فإنها لن تمنع من انشاء الثنائية:

[
    'user_one' => 2,
    'user_two' => 1
]

بمعنى أنه يجب عليك ان تتحقق قبل انشاء محادثة خاصة من:

  • ما ان كان المستخدم ذي المعرف 1 (باعتباره user_one) يمتلك بالفعل محادثة مع المستخدم ذي المعرف 2  (باعتباره user_two)
  • ما ان كان المستخدم ذي المعرف 2  (باعتباره user_one) يمتلك بالفعل محادثة مع المستخدم ذي المعرف 1 (باعتباره user_two)

استعن بالاستعلام التالي:

$existingConversation = Conversation::where([
 [ 'user_one', '=', $first_id ],
 [ 'user_two', '=', $second_id ] 
])
->orWhere([
 [ 'user_one', '=', $second_id ],
 [ 'user_two', '=', $first_id ] 
])
->first();

بعد هذا سنضمن ان هنالك ما يميز شيئا يجمع هذين المستخدمين بشكل فريد تماما. وليكن هو المعرف الخاص بالمحادثة.

لنستعمله اذن في تكوين قناة خاصة private channel يشترك بها هاذان المستخدمان فقط.

اعرف اكثر عن البث Broadcasting والقنوات الخاصة في لارافيل. سيمكنك استيعاب فكرة المحادثات الخاصة وسيمكنك ملائمة تخطيط قواعد البيانات وفق حاجتك.

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...