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

كيف يتم إرسال الرسائل واستلامها بالترتيب الصحيح في Laravel eloquent؟

محمد لارافيل

السؤال

أنا أعمل على تطبيق دردشة باستخدام Laravel ، وأحتاج إلى مساعدة في فرز الرسائل بشكل صحيح. يعمل التطبيق دون ظهور اي مشكلة ولكنه يسترد جميع الرسائل التي أرسلها المستخدم الحالي إلى أي شخص ، بالإضافة إلى الرسائل المرسلة إلى المستخدم الحالي من قبل أي شخص. أريده فقط استرداد الرسائل بين المستخدم الحالي والمستخدم الذي يدردش معه. لدي جدولين للرسائل: الدردشات التي تخزن معرفات المرسل والمستلم ، والرسائل التي تخزن محتويات الرسالة. يرجى الاطلاع على الصورة المرفقة لهياكل الجدول. لقد قمت بتضمين مقتطفات للأكواد لإظهار العلاقات بين نماذج المستخدمين والمحادثات والرسائل. هل يمكن لأي شخص مساعدتي في هذه المشكلة من فضلكم؟
Users Model

public function chats() 
{
        return $this->hasMany(Chat::class, 'recipient_id')
        ->orWhere(function($query) {
            $query->where('sender_id', '<>', $this->id)
            ->where('recipient_id', $this->id);
        })
        ->orWhere(function($query) {
            $query->where('sender_id', $this->id)
            ->where('recipient_id', '<>', $this->id);
        })->orderBy('created_at', 'asc');
}

Chats Model

public function users() 
{
        return $this->belongsTo(User::class);
}

public function messages()
{
        return $this->hasMany(Message::class, 'chat_id');
}

Messages model

public function chats()
{
        return $this->belongsTo(Chat::class, 'chat_id');
}

Messages Controller

public function getMessages($username) {
        $host = User::where('username', $username)->first();
        $user = Auth::user();

        if($username !== $user->username && !Abilities::isBlocked($username) && Abilities::canBlock($username)) {
            $messages = $host->chats()
            ->with(['messages' => function ($query) {
                $query->orderBy('created_at', 'desc');
            }])
            ->where('recipient_id', $user->id)
            ->get()
            ->each(function($chat) {
                $chat->status = $chat->sender_id === Auth::user()->id ? "sent" : "received";
            });
            
            return response()->json([
                "messages" => $messages,
            ]);
        }
        
        return response()->json(["messages" => "Unauthorized access."]);
}

Tables Structure
image_2023-05-14_124809446.thumb.png.f6464b9892abd069ef9eaaa3b9cfd9a7.png

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

Recommended Posts

  • 0

يبدو أن لديك مشكلة في استرداد الرسائل الصحيحة بين المستخدم الحالي والمستخدم الآخر في تطبيق دردشة Laravel الخاص بك. هنا بعض الأمور التي يجب مراجعتها في الأكواد الخاصة بك:

  • تحقق من دالة chats() في نموذج User:

يجب أن يكون الشرط orWhere الأول يسترد الدردشات حيث يكون المستخدم الحالي هو المرسل والمستخدم الآخر هو المستلم.

يجب أن يكون الشرط orWhere الثاني يسترد الدردشات حيث يكون المستخدم الحالي هو المستلم والمستخدم الآخر هو المرسل.

لاحظ أنه يجب استخدام الشرط where في كل من الشرطين داخل الـ orWhere.

  • تحقق من دالة users() في نموذج Chat:

يجب أن تستخدم العلاقة belongsTo بشكل صحيح لتعيين العلاقة بين نموذج Chat و User.

  • تحقق من دالة messages() في نموذج Chat:

يجب استخدام العلاقة hasMany بشكل صحيح لتعيين العلاقة بين نموذج Chat و Message.

تأكد من أن المفتاح الأجنبي لنموذج Message هو chat_id.

  • تحقق من دالة chats() في نموذج Message:

يجب استخدام العلاقة belongsTo بشكل صحيح لتعيين العلاقة بين نموذج Message و Chat.

تأكد من أن المفتاح الأجنبي لنموذج Message هو chat_id.

  • تحقق من دالة getMessages() في وحدة التحكم (Controller):

تأكد من أنك تستخدم Auth::user() للحصول على المستخدم الحالي.

يبدو أن الشرط $username !== $user->username غير ضروري، لأنه يعود بالفعل بالمستخدم الحالي.

تأكد من أن الدردشات التي تم استردادها تتناسب مع المستخدم الحالي كمستلم والمستخدم الآخر كمرسل.

بعد إجراء هذه التغييرات، يجب أن يتم استرداد الرسائل بين المستخدم الحالي والمستخدم الذي يتم الدردشة معه بشكل صحيح.

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

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...