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

Adnane Kadri

الأعضاء
  • المساهمات

    5196
  • تاريخ الانضمام

  • تاريخ آخر زيارة

  • عدد الأيام التي تصدر بها

    52

كل منشورات العضو Adnane Kadri

  1. أنواع mime التي تقوم بوصفها هي ليست الا طريقة لتوصيف انواع الملفات، وقد يحتوي النوع الواحد على العديد من الصيغ او امتدادات الملفات. جرب اضافة qt: $validated = $request->validate([ 'file' => 'mimes:mp4,mov,ogg,qt | max:20480' // ... ]); فكل من qt و mov يشيران للنوع: video/quicktime ذكر كليهما سيضمن التعامل مع هذا النوع.
  2. ليس بالضرورة، يمكن انشاء جدول واحد فقط يحوي كامل هاته الطلبات باعتبارها مخاطبة. حيث يحمل عمودين مميزين: من sent_by الى sent_to يوضحان طرفي الخطاب. اما ان كان كل من الادارة والمنطقة والقطاع نماذج في قواعد البيانات فيمكنك انشاء العديد من الاعمدة الاجنبية foreign keys التي تقبل القيمة null في هذا الجدول حيث تكون هاته الاعمدة كـ: مرسل من الادارة sent_by_administration مرسل الى المنطقة sent_to_region و: مرسل من المنطقة sent_by_region مرسل الى القطاع sent_to_sector و: مرسل من القطاع sent_by_sector بهذا الشكل يمكنك انشاء العديد من الثنائيات التي تميز خطابا ما على نحو: مرسل من الادارة الى المنطقة مرسل من الادارة الى القطاع مرسل من القطاع الى الادارة مرسل من القطاع الى المنطقة مرسل من المنطقة الى القطاع مرسل من المنطقة الى الادارة ستكون القراءة سهلة من هذا الجدول، فلما نحاول مثلا جلب الطلبات التي ارسلتها الادارة الى القطاع نبحث فقط عن: الطلبات التي قيمة sent_by_administration وقيمة sent_to_sector فيها ليستا Null. ثم لما نحاول انشاء طلب جديد. نقوم فقط بتحديد الثنائيتين بحسب من يرسل الخطاب والى من.
  3. لا مشكلة في ذلك ايضا، كل طلب هو [انموذج بيانات] يحتوي خصائص معينة. وبما انه كذلك يمكن نمدجته كجدول يحتوي اعمدة في قواعد البيانات، هاته الاعمدة هي هاته الخصائص. فان كان الطلب يجب ان يحتوي تاريخا انشئ به نضيف العمود created_at. ان كان الطلب يجب ان يحتوي مرسلا ومستقبلا نضيف به العمود sent_by و sent_to . ان كان الطلب يندرج ضمن عدة انواع فان الطلب يمتلك نوعا. نضيف العمود type الى الجدول. هل تواجهين مشكلة بهاته النمذجة؟
  4. ما المشكلة في اعتبار هاته الطلبات نموذج بيانات مثلها مثل اي نموذج آخر؟ حيث ان مدير المدرسة هو من يقوم بإنشاء هاته الطلبات. يمكنك التوصل الى انشاء جدول orders يحوي تفاصيل هذا الطلب (منشئ من طرف، موجه الى المدير الفلاني ، نوع الطلب فيما ان كان طلب عجز، زيادة او شكوى او غيرها). يمكنك ايضا اضافة حقل seen او reviewed يخزن قيمة بوليانية تعبر عن ما ان كان الاطلاع عليه من قبل مدير الادارة. حيث: مدير المدرسة يمكنه انشاء طلبات، يمكنه الوصول الى هاته الطلبات في صفحة ما. مدير الادارة يمكنه الوصول الى الطلبات الموجهة له في صفحة مخصصة. ولنقل ايضا انه يمكنه تغيير حالتها كمقروءة مثلا، او حتى الرد عليها. واسطة كل من هؤلاء العملاء هي قاعدة البيانات، يمكنك الاعتماد على مركزيتها في انشاء اي نموذج بيانات ترغبيه.
  5. ما تتحدث عنه تسميه لارافيل التسلسل الى مصفوفات Serializing To Arrays والتسلسل Serialization في Eloquent هو عملية تحليل نموذج او تجميعة الى مصفوفة او كائن JSON. فعند بناء واجهات تطبيق برمجية نحتاج في الغالب تحويل النماذج الى مصفوفات او كائنات JSON ليسهل تصديرها واستيرادها والتعامل معها. يوجد التابع toArray لتحويل ناتج النموذج الى مصفوفة: $user = App\Models\User::first(); dd($user->toArray()); السلسلة في رابط الكائنات بالعلاقات Eloquent
  6. يوجد التابع exists عن الدالة المساعدة view، يمكنك الاستعانة به للتحقق من ما ان كان هنالك ملف عرض باسم معين. تستعمل كـ: view()->exists('path.to.myview') او عن طريق الواجهة View كـ: View::exists('path.to.myview') اقرأ أكثر عن الواجهات (Views) في Laravel
  7. أظن ان المشكلة في تضمين ملفات التنسيق الاساسية بالموقع، فالصفحات من مثل : https://abadc.com.sa/ar/courses/ و https://abadc.com.sa/ar/faq/ تقوم بتحميل ملفات التنسيقات بوساطة حزمة lightspeed بشكل عادي. في حين انه في الصفحة الرئيسية للموقع يتم استعمال ميزة Unique Css من هاته الحزمة لتحميلها. لاحظ ان روابط ملف التنسيقات فيه يبدوا كـ: https://abadc.com.sa/wp-content/litespeed/ucss/85cf37505c2be29695253ccf7665a43f.css?ver=cd0f4 في حين ان الاولى تبدوا كـ: https://abadc.com.sa/wp-content/litespeed/css/7f16c4ab4bbd2fc675a5d0002db20502.css?ver=cd0f4 يحتمل ان يكون هنالك مشكلة في اعداد حزمة Lightspeed للعمل مع تطبيقك. جرب الغاء ميزة Unique Css من صفحة الاعداد، يوجد خيار Generate Unique Css. الغ تفعيله. أظنه ما يسبب المشكلة. LiteSpeed Cache > Page Optimization > CSS Settings جربت تضمين ملف تنسيقات عادي من مجلد CSS مباشرة ونجح الامر.
  8. لا أظن ذلك، فعنوان الماك MAC أو عنوان التحكم في الوصول إلى الوسائط Media Access Control هو معرف فريد يتم تعيينه لاستخدامه كعنوان شبكة في الاتصالات بما في ذلك Ethernet و Wi-Fi و Bluetooth. بعض شركات التصنيع قد تدمج رمزا معينا يميزها ضمن عناوين MAC الخاصة بالجهاز الذي تصنعه. اي ان المعلومات التي يمكن جلبها منه محدودة جدا. اظن ان ما تبحث عنه هو تحليل عنوان IP. يمكنك عن طريق عنوان الـ IP معرفة نوع الجهاز، المتصفح والموقع وغيرها من المعلومات.
  9. نعم، لن يكون ذلك مشكلة ايضا. يمكنك التعامل مع مسألة جلب بيانات معلمي مدرسة معينة بشكل مستقل تماما.
  10. معروف ان عملية التشفير هي طريقة لحماية البيانات تستعمل خوارزمياتها مفتاحا للتشفير والغاءه. بالمختصر المفيد، كل مكون من مكونات لارافيل يستخدم التشفير encyption او يتضمنه يستخدم APP_KEY بشكل ما. مثال: ملفات تعريف الارتباط الجلسات كلمات المرور رموز csrf وطريقته في حماية البيانات بهذا الشكل هي في كونه وسيطا خفيا يظهر للتطبيق نفسه فقط. ففي حالة امتلاك طرف آخر لمفتاح التشفير سيمكنه صياغة قيم ملفات تعريف الارتباط والجلسات ورموز csrf واحداث مشاكل كبيرة بتطبيقك. كونه بهاته السرية يسد ثغرة أمنية كبيرة. ستجد انه مشار اليه اصلا كاعداد ضبط للتعامل مع التشفير في لارافيل. راجع: التشفير (Encryption) في Laravel. يمكن الاطلاع على انه يتم تحميله من قبل موفر خدمة التشفير في التطبيق، هذا الملف كائن بالمسار: Illuminate/Encryption/EncryptionServiceProvider.php
  11. وجدت الحزمة TheDragonCode/laravel-app مكافئة لما كان يقوم به الامر app:name. يمكن تثبيتها عن طريق: composer require dragon-code/laravel-app --dev ثم اعادة تنفيذ الامر: php artisan app:name <name> يمكن ايضا كفكرة، تعديل قيمة متغير البيئة APP_NAME عن طريق الوصول الى محتويات الملف واعادة كتابتها.
  12. اضافة لما اشار اليه المدرب حسن، قد لا تواجه مشكلة بتنفيذ php artisan down لأن التطبيق ينتقل من وضع التمكين الى وضع التعطيل. قد تكون هنالك مشكلة باعادة تمكينه مجددا فالوصول الى اين تقوم بتشغيل php artisan up قد يكون هو الآخر معطلا ضمن وضع التصحيح. لتجنب هاته المشكلة يمكنك استثناء عنوان ال IP الخاص بالجهاز الذي سيقوم باعادة التمكين مجددا. يوجد الخيار --alow php artisan down --allow=192.168.0.0 كطريقة ابسط اكثر. يمكنك مباشرة حذف ملف down الكائن بـ storage/framework. فعند تشغيل الامر php artisan down يتم انشاء هذا الملف. وعند الامر php artisan up سيتم حذفه. يمكنك عمل ذلك يدويا دون اللجوء لواجهة Artisan لتنفيذ هاته الاوامر.
  13. يمكن انشاء دور مدير مدرسة. حيث ان هذا الدور يمتلك صلاحية رؤية معلمي مدرسته فقط. ما المانع في ذلك؟ وقد لا يكون هنالك حاجة اساسا من موضوع الصلاحيات، لما لا تقومين فقط بتنفيذ استعلام يقوم بجلب بيانات المعلمين الخاصين بمدرسة المدير؟ $doctor = Doctor::find($target_doctor_id); $doctor_school = $doctot->school_id; $teachers = Teacher::where('school_id' ,$doctor_school)->get(); او يمكنك تنظيم العملية اكثر عن طريق علاقات Eloquent. حيث: كل مدرسة تمتلك العديد من المعلمين. => علاقة one to many كل مدرسة تمتلك مديرا واحدا. => علاقة one to one يكون ناتج الاستعلام مشابها لـ: $teachers_of_a_school = Doctor::find($target_doctor_id) ->school() ->teachers(); مقدمة إلى رابط الكائنات بالعلاقات Eloquent - موسوعة حسوب
  14. ابسط تعامل مع الأخطاء يكون عن طريق طباعتها في نافذة الطرفية console عن طريق console.log مثلما هو موضح في المثال السابق. ان كان هنالك مشكلة في تصديرها واستيرادها يمكن تعريفها ضمن ذات الملف app.js: function handleError(err) { console.log(err) } او مباشرة بدل handleError نفسها: if(err) { console.log(err) } سيكون هذا كفيلا بحل المشكلة وتشخيص الخطأ تشخيصا كاملا يظهر نص رسالته في نافذة console للخادم.
  15. بجانب ما اقترح المدرب عاطف، يمكنك الاستعانة بحزمة laravel-permission المقدمة من مجموعة spatie للتعامل مع الادوار والاذونات في تطبيقات لارافيل. تتعامل هاته الحزمة مع الصلاحيات وفق المنطق التالي: يمتلك المستخدم [دورا] ما. هذا الدور يمتلك مجموعة معينة من [الأذونات] التي يتم اسنادها له. يمكن اسناد دور ما لمستخدم ما. يمكن اسناد اذونة او صلاحية ما لدور ما. وتستخدم في مضمونها مفهوم البوابات والسياسات Gates & Policies. ويتم تعريف هاته الاذونات والادوار في ملفات مستقلة يمكن التعامل معها بشكل مستقل تماما. حيث يتم التحقق كل مرة يتم فيها استهداف حدث معين من التحقق مما اذا كان المستخدم الذي يقوم بالطلب يمتلك دورا من بين صلاحياته الوصول الى هذا المورد. مثال: يمتلك المستخدم "احمد" الدور "مدير مدرسة". هذا الدور يمتلك صلاحيات قراءة. محو، وتعديل الارشيف. عندما يحاول احمد الوصول للارشيف تحدث كامل العملية ويتم التحقق من ترخيصه. اعرف أكثر عن الترخيص (Authorization) في Laravel
  16. هنالك مشكلة في تشخيص الأخطاء لديك، فالوظيفة handleError غير معرفة لديك. يفترض ان تستوردها من الوحدة النمطية التي تختص بالتعامل مع الأخطاء لديك. او ان تعرفها كدالة ضمن app.js const { handleError } = require('./path/to/handle_errors_modules'); حيث يكون كـ: exports.handleError = (err) => { // معالجة الخطأ console.log(err) } قام المدربون بتوجيهك نحو الحل في سؤال سابق لك.
  17. يمكنك استعمال محرر JSHint لهذا الغرض، وهو أداة تساعد في اكتشاف الأخطاء والمشاكل المحتملة في شيفرة JavaScript نرفقها لها. اتذكر استعماله في مشروع مشابه. يحتوي واجهة تطبيق برمجية مرنة جدا، تقوم باستقبال شيفرات الجافاسكربت وتشخيص الاخطاء بها على نحو دقيق (موضع الخطأ من حيث السطر والمحرف ودرجة خطورته ونص رسالة الخطأ كاملا وغيرها).
  18. لا يمكن تعميم اجابة السؤال على كامل الشركات، فكل شركة تعتمد طريقة معينة. كما ان استعمال Laravel blade لا يعني التخلي عن واجهات التطبيق البرمجية API فقد يحدث ان نجد من يستعمل قوالب لارافيل في الاتصال بواجهات معينة. ولكن عموما، تقوم الشركات الكبرى بفصل تطبيقات الواجهات الأمامية عن تطبيقات الواجهات الخلفية بشكل تام، لأن هذا الفصل يمنح المواقع ميزة التوسع scalability ويضمن تشغيلها على كامل النظم والبيئات، فأغلب الشركات التقنية لا تتركز في الغالب على تطبيق ويب وفقط، بل نجدها تمتلك تطبيقا للأندرويد وتطبيقا للأيفون وغيره. فالتعامل هنا يكون مع خادم واحد والعديد من واجهات العملاء، هاته المركزية تقتضي الاتصال بها عن طريق طلبيات الـ HTTP وال JSON. هذا بجانب ان هاته الشركات في الغالب تحاول خدمة مفاهيم حديثة في كل من الجانبين. فنجد مثلا انها تعتمد مفاهيم مثل التصيير على المتصفح CSR و تطبيقات الصفحة الواحدة SPA و التصيير على الخادم SSR وغيرها. ورغم ان لارافيل اطار عمل ويب شامل إلا انه يبقى عاجزا عن تطبيق هاته المفاهيم لوحده تماما او على الاقل لن يكون افضل مما هو متخصص فيها بالضبط. مثال: اطر عمل الواجهة الامامية. هل يعني هذا أن استعمال laravel blade غير عملي؟ لا، ولكن لكل استعمال سياقه. ومتطلبات المشروع هي ما تحدد ما ان كنت ستقوم بناء واجهة ببيانات برمجية تصدر بياناتها كـ JSON او ان تستعمل لارافيل كتطبيق ويب شامل.للتعامل حتى مع الواجهات الامامية. وفيما يلي اسماء عملاقة تستعمل لارافيل كتطبيق ويب شامل: pfizer bbc mastercard
  19. يوجد الخاصية primaryKey لخدمة هذا الغرض: class User extends Eloquent { protected $primaryKey = 'ID'; } لأن لارافيل Eloquent سيفترض أن كل جدول يحتوي على عمود مفتاح أساسي باسم id. نقوم عن طريق هاته الخاصية بتجاوز هذا الافتراض.
  20. يمكنك استخدام قاعدة البيانات نفسه كدرايفر تخزين مؤقت لنتائج هاته الاستعلامات. اعداد قاعدة البيانات لتكون دريفر تخزين مؤقت تكون عن طريق اسناد القيمة database للمتغير CACHE_DRIVER في ملف متغيرات البيئة env. CACHE_DRIVER=database استعن بالامر: php artisan cache:table لإنشاء ملف تهجير يخص جدولي التخزين المؤقت في قاعدة البيانات. يكونان باسم cache و cache_locks بعد هذا ستحتاج البدء في استخدامه بشكل عادي. فبدل اعاد الاستعلام كل مرة كـ: public function index() { $data = [ 'latest_articles' => Article::orderBy('id' ,'desc')->limit(10)->get(), 'popular_articles' => Article::orderBy('stars' ,'desc')->limit(10)->get(), 'starred_categories' => Category::where('starred' ,true)->get(), 'latest_comments' => Comment::orderBy('id' ,'desc')->limit(10)->get(), ]; return view('yourview' ,compact('data')); } نقوم بـ: public function index() { $data = null; // التحقق من ما ان لم يتم من قبل تخزين هذا المفتاح مؤقتا if (!Cache::has('my_data_key')) { // اعادة الاستعلام $d = [ 'latest_articles' => Article::orderBy('id' ,'desc')->limit(10)->get(), 'popular_articles' => Article::orderBy('stars' ,'desc')->limit(10)->get(), 'starred_categories' => Category::where('starred' ,true)->get(), 'latest_comments' => Comment::orderBy('id' ,'desc')->limit(10)->get(), ]; // وضع نتائج الاستعلام في التخزين المؤقت Cache::put('my_data_key', $d , now()->addMinutes(180)); $data = $d; } else{ // جلب البيانات من التخزين المؤقت $data = Cache::get('my_data_key'); } return view('yourview' ,compact('data')); } او لننظم العملية اكثر فتصبح: /** * عرض الصفحة الرئيسية للموقع * * @return \Illuminate\Http\Response */ public function index() { $data = $this->loadData(); return view('yourview' ,compact('data')); } /** * تحميل البيانات من التخزين المؤقت * او اعادة تخزينها * * @return array */ private function loadData() { if (!Cache::has('my_data_key')) Cache::put('my_data_key', $this->queryDataFromDB() , now()->addMinutes(180)); return Cache::get('my_data_key'); } /** * تنفيذ استعلامات قواعد البيانات * المحددة * * @return array */ private function queryDataFromDB() { return [ 'latest_articles' => Article::orderBy('id' ,'desc')->limit(10)->get(), 'popular_articles' => Article::orderBy('stars' ,'desc')->limit(10)->get(), 'starred_categories' => Category::where('starred' ,true)->get(), 'latest_comments' => Comment::orderBy('id' ,'desc')->limit(10)->get(), ]; } التخزين المؤقت (Cache) في Laravel استفد اكثر من هاته الاجابة
  21. اكيد لن يكون يدويا، فأنت لن تقوم بعملية النسخ هي الأخرى بشكل يدوي. استعمل استعلام التحديث مع استعلام النسخ. نفذ الاستعلامات عن طريق PDO مثلا.
  22. هل تحاول نسخ سطر ما مع تغيير قيمة المفتاح foreign فيه الى قيمة أخرى؟ لما لا تنفذ استعلام UPDATE SET foreign_key_checks = 0; UPDATE order_clothes SET order_id='xyz' WHERE id='abc'; SET foreign_key_checks = 1; بعد استعلام النسخ وفقط: INSERT INTO order_clothes (c1, c2, ...) SELECT c1, c2, ... FROM order_clothes WHERE id = 1 لأن هذا ما تقوم به وظيفة النسخ في phpmyadmin على مستوى SQL يمكنك تعديلها هي الأخرى بما يوافق مرادك. SQL mysql
  23. ليس تماما، فمثلما اشار المدرب حسن ف VueJS في الاصل هو اطار عمل جافاسكربت موجه للواجهات الامامية، مفتوح المصدر ويتبنى معمارية MVVM أو model–view–viewmodel. ورغم تطويره لاستيعاب مفاهيم مثل التصيير على الخادم Server side rendering (بمساعدة NodeJS) الا انه لا يمكن الاعتماد عليه بشكل كلي لانشاء تطبيقات ويب شاملة. ستبقى تحتاج التعامل مع لغات او ادوات الواجهة الخلفية. Django، Nodejs أو PHP او غيرها. فهو موجه اساسا لبناء واجهات ويب تفاعلية توظف مفاهيم حديثة مثل التوجيه على المتصفح وتطبيقات الصفحة الواحدة وغيرها. أما بالنسبة لـ NodeJS فهو اطار عمل الواجهة الخلفية ينفذ جافاسكربت على مستوى الخادم. يستعمل في الغالب معمارية MVC أو model-view-controller. مكتوب أساسا بـ C و C++. وموجه للتعامل مع طلبيات الـ HTTP. قواعد البيانات وغيرها. يمكن الاعتماد على NodeJS بالكامل لبناء تطبيقات ويب شاملة، ولا يمكن ذلك بـ VUEJS وحده. مكان VueJS هو الواجهة الامامية، اما NodeJS فهو الواجهة الخلفية. يوجد اطار عمل ويب شامل مبني على كل من VueJS و NodeJs يسمى NuxtJS شبيه ومستلهم من NextJS الخاص بـ ReactJS. يوظف NodeJS في الخادم و VueJS في المتصفح ويسهل عملية انشاء تطبيقات ويب شاملة.
  24. لا أظن انه يوجد هنالك قاعدة معينة ثابتة فلكل منها استعمالاته وسياقاتها التي يخدمها. يكون استخدام toggle عمليا عندما نحتاج ازالة واضافة صنف ما مع الاعتبار لامتلاك العنصر للصنف من عدمه. فان كنا مثلا نخصص زرا للتبديل بين سمات الموقع : داكن وعادي. بحيث يتحكم في ذلك امتلاك العنصر body للصنف dark. سيمكن اسناد الوظيفة التي تقوم بعمل toggle للصنف الى حدث الضغط على زر التبديل بين الوضعين. يكون استخدام remove/add عمليا عندما نحتاج ازالة واضافة صنف ما دون الاعتبار لامتلاك العنصر للصنف من عدمه. أي ان التركيز هنا لا يكون على العنصر نفسه، وانما على حدث خارجي تماما. مثال: يوجد زر "الاشتراك في القائمة البريدية" في ترويسة الموقع، بحيث يقوم هذا الزر عند الضغط عليه باظهار نافذة منسدلة تحمل استمارة للاشتراك. تظهر ايضا زرا اغلاق يمكن من عليه اخفاء النموذج مجددا. التركيز الآن هو على دلالة الحدث الخارجي قبل العنصر نفسه. فعندما نضغط على زر الاظهار سيتم اعطاء الصنف "visible" لهذا العنصر. ثم عند الاخفاء سيتم ازالة الصنف "visible". add/remove تقبلان اكثر من معامل. بمعنى انه يمكن عن طريقهما التعامل مع اكثر من صنف وليس واحد فقط. h1.classList.add('green','black' ,'blue') أما toggle فلا، يمكنها التعامل مع صنف واحد فقط. h1.classList.toggle('red') بالمختصر، اذا كانت امتلاك الصنف للعنصر مهما في العملية فإن استعمال toggle سيكون أولى. وإلا فإنه سيمكن استعمال add/remove لاضافة وازالة عدد معين من الاصناف .
  25. فكرة المحادثات الخاصة اساسا هي في انها محادثات او غرف عامة يشترك بها مستخدمان فقط. فان كنت تعرف جدولا خاصا بالمحادثات يمكنك اضافة عمودين يميزان هذين المستخدمين له. وليكن 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 والقنوات الخاصة في لارافيل. سيمكنك استيعاب فكرة المحادثات الخاصة وسيمكنك ملائمة تخطيط قواعد البيانات وفق حاجتك.
×
×
  • أضف...