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

سمير عبود

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

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

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

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

    34

إجابات الأسئلة

  1. إجابة سمير عبود سؤال في ظهور خطأ عند استخدام التابع sort في mongodb ضمن بايثون كانت الإجابة المقبولة   
    التابع .sort() في pymongo يأخذ مُعاملين key و direction لذا ، إذا كنت تريد الترتيب حسب المعرف _id ، فعليك الترتيب بهذا الشكل:
    .sort("_id", 1) أو:
    .sort("_id", pymongo.ASCENDING) // أو .sort("_id", pymongo.DESCENDING) إن كنت تريد الترتيب حسب عدة حقول فيُمكنك:
    .sort([("field1", pymongo.ASCENDING), ("field2", pymongo.DESCENDING)])  
  2. إجابة سمير عبود سؤال في لماذا توجد جملة else مع حلقة for في بايثون؟ كانت الإجابة المقبولة   
    لو تم كتابتها بشكل مُباشر سيتم تنفيذها في كل الأحوال أما بإستخدام else مع for فسيتم تنفيذ الكتلة البرمجية الموجودة في else في حالة إنهاء الحلقة بشكل عادي فقط أي أنه إذا تم تنفيذ break فلن يتم تنفيذ جزء else في حالتك:
    سيتم طباعة كل الأعداد من 0 ل 9 و عند الوصول ل 9 سيتحقق الشرط و يتم تنفيذ break و هنا الحلقة لن يتم إكماله بشكل عادي و بالتالي لن يتم تنفيذ جزء else جرب مثلا التالي:
    for i in range(3): print(i) if i == 9: print("Found 9") break; else: print("Completed successfully") سيكون الخرج:
    0 1 2 Completed successfully أي أن جزء else قد تم تنفيذه و بالتالي فإنه قد تم تنفيذ الحلقة كلها و الخروج منها بشكل عادي.
    لنٌعطِ مثال آخر و لنفترض أنه طُلب منك إنشاء دالة search للبحث عن عُنصر ما في قائمة و إرجاع الفهرس المتواجد به إن وُجد بإستعمال حلقة for فإذا تم إيجاد العُنصر يتم الخروج من الحلقة دون اكمال بقية العناصر و إذا لم يتم إيجاد العُنصر يتم إرجاع -1
    أمامك طريقين إستخدام مُتغير بولياني و تهيئته ب false و عند إيجاد العُنصر يُصبح true ثم القيم ب break للحلقة ثم فحص قيمة المُتغير البولياني و إرجاع القيمة المناسبة:
    def search(lst, s): found = False for i, val in enumerate(lst): if val == s: found = True break if not found: return -1; return i lst = ["foo", "bar", "baz"] print(search(lst, "baz")) # 2 print(search(lst, "faz")) # -1 أو إستخدام الطريقة for .. else و الإستغناء عن المتغير البولياني:
    def search(lst, s): for i, val in enumerate(lst): if val == s: break else: return -1; return i lst = ["foo", "bar", "baz"] print(search(lst, "baz")) # 2 print(search(lst, "faz")) # -1 و بهذا يُصبح الكود أكثر مقروئية و إستخدام else مع for في مثل هذه الحالات أكثر منطقية.
  3. إجابة سمير عبود سؤال في عمل دالة مشابهة لـ random.choice مع وجود احتمالية معينة لكل عنصر في بايثون كانت الإجابة المقبولة   
    هناك طريقتان لإجراء اختيارات عشوائية بإستعمال إحتمالات إختيار لكل عنصر في بايثون:
    إذا كنت تستخدم Python 3.6 أو أعلى ، فاستخدم ()random.choices عدا ذلك ، استخدم ()numpy.random.choice random.choices:
    قدم Python 3.6 دالة جديدة random.choices  في الوحدة العشوائية. باستخدامها يمكننا إجراء اختيار عشوائي مرجح مع الاستبدال. يمكنك أيضًا تسميتها عينة عشوائية مرجحة مع الاستبدال.
    توقيع الدالة كالتالي:
    random.choices(population, weights=None, *, cum_weights=None, k=1) تقوم بإرجاع قائمة بحجم k للعناصر المختارة من المجتمع (population)
    population: هي بنية التسلسل أو البيانات التي تريد الإختيار منها weights أو cum_weights: لتحديد احتمال الاختيار لكل عنصر. k: عدد العينات التي تريدها من المجتمع (population) ملاحظة: لا يُمكنك تحديد كل من weights و cum_weights في نفس الوقت بل يجب تحديد أحدهما و إن لم يتم تحديد أحدهما ستكون كل العناصر لديها نفس إحتمال الإختيار. عدد العناصر المُحددة في سلسلة الأوزان يجب أن يكون نفس عدد عناصر المُجتمع (population)، تستطيع إستخدام الأعداد الصحيحة (integers) الغير سالبة او floats في الأوزان، الأوزان يجب أن لا تكون سالبة.
    مثال: اختيار 5 عناصر من القائمة باحتمالات مختلفة
    import random numberList = [1, 2, 3, 4, 5] print(random.choices(numberList, weights=(10, 20, 30, 40, 50), k=5)) # Output [5, 5, 4, 5, 4] ملاحظة: 
    كما ترى في الخرج ، تلقينا العُنصر "5" ثلاث مرات لأننا خصصنا له أعلى وزن. لذلك فإن لديها أعلى احتمالية ليتم اختيارها مجموع الأوزان ليس 100 لأنها أوزان نسبية وليست نسبًا. حيث أن الإحتمال لكل عُنصر يُحسب كالتالي: وزن العُنصر / مجموع الأوزان.
    إذا أردنا إرجاع عُنصر واحد فقط سنُحدد k بواحد لكن ناتج الدالة سيكون قائمة تتكون من عنصر واحد.
    إذا أردت إنشاء الدالة التي تريدها بإستخدام هذه الطريقة يُمكنك ذلك من خلال:
    import random numberList = [1, 2, 3, 4] def choice(population, w): return random.choices(population, weights=w, k=1)[0] print(choice(numberList, (0.2, 0.2, 0.4, 0.2))) إستخدام مكتبة numpy:
    لتثبيت المكتبة: pip install numpy
    توقيع الدالة المُستخدمة كالتالي:
    numpy.random.choice(a, size=None, replace=True, p=None) حيث a هو المجتمع أو مصدر البيانات، size هو عدد العناصر التي نريد إختيارها، و p يُستخدم لوضع إحتمالات الإختيار.
    ملاحظة: يجب ان يكون مجموع الإحتمالات هو 1.
    إذا أردت إنشاء الدالة التي تريدها بإستخدام هذه الطريقة يُمكنك ذلك من خلال:
    import numpy as np numberList = [1, 2, 3, 4] def choice(a, w): return np.random.choice(a, p=w) print(choice(numberList, [0.1, 0.6, 0.2, 0.1]))  
  4. إجابة سمير عبود سؤال في ما هو الفرق بين عملية النسخ السطحي والنسخ العميق في بايثون؟ كانت الإجابة المقبولة   
    الفرق بين النسخ السطحي والنسخ العميق يظهر فقط في الكائنات المركبة (الكائنات التي تحتوي على كائنات أخرى ، مثل القوائم أو نُسخ من الفئات) حيث:
    يُنشئ النسخ السطحي كائنًا مركبًا جديدًا ثم تُدرج مراجع محتوياته إلى الكائنات الموجودة في الأصل.
    أما النسخ العميق يُنشئ كائنًا مركبًا جديدًا ، ثم تُدخل نسخًا متكررة فيه من الكائنات الموجودة في الأصل
    مثال للتوضيح:
    import copy a = [1, 2] b = [4, 5] c = [a, b] إستخدام النسخ العادي او السطحي:
    d = copy.copy(c) print(id(c) == id(d)) # False print(id(c[0]) == id(d[0])) # True و هذا ما ذكرناه أن كلاهما يُنشئ كائناً جديداً. لذلك في الأول أعطى False بينما قلنا أنه في النسخ العادي مُحتويات الكائن المُنشأ تُدرج إلى مراجع الكائنات الموجودة في الأصل لذلك أعطى في الطباعة الثانية True.
    إستخدام النسح العميق:
    d = copy.deepcopy(c) print(id(c) == id(d)) # False print(id(c[0]) == id(d[0])) # False و هذا ما ذكرناه في النسخ العميق أنه يُنشئ كائناً جديداً ثم يُنشئ كائنات منسوخة من الكائنات الموجودة في الأصل في مُحتويات الكائن الذي نريد نسخه.
  5. إجابة سمير عبود سؤال في كيفية الوصول إلى خاصية في كائن من خلال نص في بايثون؟ كانت الإجابة المقبولة   
    يُمكن إستخدام الدالتين getattr و setattr للوصول للخاصيات:
    getattr(x, 'y') <=> x.y setattr(x, 'y', v) <=> x.y = v و هذا تطبيق للدالتين في مثالك:
    class Foo: def __init__(self): self.attr1 = True self.attr2 = False foo = Foo() x = "attr1" y = 123 setattr(foo, x, y) z = getattr(foo, x) print(z) # 123  
  6. إجابة سمير عبود سؤال في معرفة الإختلافات بين قائمتين في بايثون؟ كانت الإجابة المقبولة   
    يُمكن الحصول على الفرق بين القائمتين بالشكل التالي:
    lst1 = ['One', 'Two', 'Three', 'Four'] lst2 = ['One', 'Two'] result = list(set(lst1) - set(lst2)) print(result) # ['Four', 'Three']  
  7. إجابة سمير عبود سؤال في كيف احضر في الدوره؟ كانت الإجابة المقبولة   
    دروس الدورة موجودة في الأكاديمية على شكل صفحات ويب حيث أنه بدون منحك صلاحية لهذه الصفحات من قبل الإدارة لن تتمكني من الوصول لهذه الصفحات و بالتالي لمُحتويات الدورة، عند الإشتراك في أي دورة سيتم منحك تلك الصلاحية و سيتم ربط حسابك بالدورة التي تم الإشتراك فيها. أما إن لم يكن لديك حساب فستتكفل الأكاديمية بفتح حساب لك. عُموماً عند الإشتراك في أي دورة سيتم إرسال كافة التوجيهات من خلال رسالة إلى بريدك الإلكتروني الذي تم الإشتراك به.
    هناك بعض الأسئلة و المواضيع الشائعة حول الأكاديمية و الدورات يُمكنك الوصول إليها من خلال: مركز المساعدة
  8. إجابة سمير عبود سؤال في إظهار ملف PDF في المتصفح دون تحميله في لارافل كانت الإجابة المقبولة   
    منذ الإصدار laravel 5.2 أصبح بالإمكان إستخدام التابع file لإرجاع الملف دون تحميله في جهاز العميل بهذا الشكل:
    return response()->file($pathToFile); return response()->file($pathToFile, $headers); كما يُمكن إستخدام الطريقة التالية في حالة كنت تستخدم إصدار أقدم:
    $filename = 'test.pdf'; $path = storage_path($filename); return Response::make(file_get_contents($path), 200, [ 'Content-Type' => 'application/pdf', 'Content-Disposition' => 'inline; filename="'.$filename.'"' ]); لأنه بإستخدامك للتابع download فإنه تلقائياً سيتم إستخدام القيمة attachment للخاصية Content-Disposition التي تفرض على المتصفح تحميل الملف.
  9. إجابة سمير عبود سؤال في فشل اختبار رفع الملفات في لارافل كانت الإجابة المقبولة   
    عند إنشائك نُسخة من الصنف UploadedFile قم بتمرير القيمة true لآخر وسيط بهذا الشكل و هذا الوسيط هو وسيط بولياني يأخذ true إن كانت البيئة هي بيئة إختبارية و القيمة الإفتراضية له هي false.
    $file = new UploadedFile($path, $name, filesize($path), 'image/png', null, true); ^^^^ و هذا مثال يوضح الآلية بإعتبار وجود ملف صورة بالإسم test.png بداخل مجلد tests/stubs:
    <?php class UploadTest extends TestCase { public function test_upload_works() { $stub = __DIR__.'/stubs/test.png'; $name = str_random(8).'.png'; $path = sys_get_temp_dir().'/'.$name; copy($stub, $path); $file = new UploadedFile($path, $name, filesize($path), 'image/png', null, true); $response = $this->call('POST', '/upload', [], [], ['photo' => $file], ['Accept' => 'application/json']); $this->assertResponseOk(); $content = json_decode($response->getContent()); $this->assertObjectHasAttribute('name', $content); $uploaded = 'uploads'.DIRECTORY_SEPARATOR.$content->name; $this->assertFileExists(public_path($uploaded)); @unlink($uploaded); } } بإمكانك أيضاً النظر إلى التابع fake فهو يُساعد كثيراً في عملية إختبار رفع الملفات مثال:
    <?php class UploadTest extends TestCase { public function test_upload_works() { $this->post( action('AttachmentController@store'), ['file' => UploadedFile::fake()->image('file.png', 600, 600)] ); /** @var \App\Attachment $attachment */ $this->assertNotNull($attachment = Attachment::query()->first()); $this->assertFileExists($attachment->path()); @unlink($attachment->path()); } }  
  10. إجابة سمير عبود سؤال في ما الفرق بين input و raw_input في بايثون كانت الإجابة المقبولة   
    الفرق بين input و raw_input هو أن raw_input غير موجودة في الإصدار 3.x بينما input موجودة. في الإصدارات 2.x كانت raw_input موجودة و تم إعادة تسميتها إلى input في الإصدارات 3.x، بينما تم حذف الدالة input القديمة.
    ما يعني أن raw_input القديمة و input الجديدة هما نفس الشيء بينما input القديمة كانت تقرأ الإدخال و تحاول تفسيره او معالجته كأنه تعليمة برمجية. يُمكن محاكاة عمل الدالة input القديمة بإستخدام input بالإضافة إلى الدالة eval:
    # Python 3 def old_input(str): return eval(input(str)) ex1 = input("type 1: "); # 5 + 6 ex2 = old_input('type 2: ') # 5 + 6 print(ex1) # 5 + 6 print(ex2) # 11
  11. إجابة سمير عبود سؤال في خطأ 500 | SERVER ERROR في صفحة الـ show استضافة هيروكو كانت الإجابة المقبولة   
    هناك خطأ ما يحدث عند العرض. بإمكانك تفعيل خاصية APP_DEBUG في ملف env. لعرض تفاصيل الخطأ الذي يحدث حتى يُمكنك معالجته.
    @علي العبدالله
    لاحظ أن الخطأ الآن يُخبرك:
    Class "App\Models\day" not found تأكد من أن إسم الملف و الكلاس Day و أعد تسميته في تعريف العلاقة في النموذج Habit لأنه كما أعتقد أن نظام ويندوز لا يأخذ إعتبار لل capital و small في المسارات بينما الأمر يختلف في نظام تشغيل آخر ك لينوكس مثلاً.
     
  12. إجابة سمير عبود سؤال في خطأ ValueError: invalid literal for int() with base 10 في بايثون كانت الإجابة المقبولة   
    السبب أن 10.111 هو عدد عشري في هيئة سلسلة نصية و ليس عدد صحيح فلو كان "10" يُمكنك إستخدام int مباشرة:
    x = "10" print(int(x)) # 10 بما أنه عشري يُمكنك إستخدام float لتحويله من نص إلى float ثم بإمكانك أخذ العدد الصحيح منه:
    x = "10.111 " print(int(float(x))) # 10 او إستخدام دوال math بالشكل الذي تريد مثال:
    import math x = "5.6" print(math.floor(float(x))) # 5 print(math.ceil(float(x))) # 6
  13. إجابة سمير عبود سؤال في ظهور خطأ Internal Server Error عند حذف الملفات في لارافل كانت الإجابة المقبولة   
    الخطأ 500 هو خطأ عام فالأفضل أن تٌفعل وضع التطوير و التصحيح حتى تظهر الأخطاء الفعلية التي تُسبب المُشكلة من خلال 
    APP_DEBUG=true في ملف env.
    تحتاج إلى إستيراد كلاس File الذي تستخدمه تأكد من ذلك:
    use Illuminate\Support\Facades\File; إن كان profiles عبارة عن مجلد فينقصك / في مسار الملف:
    if(File::exists(public_path('images/profiles/' . $fileName))){ File::delete(public_path('images/profiles/' . $fileName)); } قد تكون المُشكلة مُشكلة أذونات على الملفات تأكد من إعطائك الأذونات الصحيحة للملفات.
    إن كنت قد غيرت مكان مجلد public أو قمت بحذفه لسبب ما على الخادم تحتاج إلى تغيير الدالة public_path حتى تقوم بإرجاع المسار الصحيح كما يلي في الملف index.php:
    $app->bind('path.public', function() { return __DIR__; });  
  14. إجابة سمير عبود سؤال في مشكلة في استخدام join في لارافل كانت الإجابة المقبولة   
    السبب في المُشكلة أنك لا تقوم بإرجاع النتائج من الإستعلام فحالياً المُتغير res يحمل نُسخة من باني الإستعلامات فقط ( Query Builder ) و لا يحتوي على نتيجة ذلك الإستعلام لجلب النتائج إستخدم التابع get بالشكل التالي:
    $res = DB::table('book_author') ->join('books', 'books.id', '=', 'book_author.book_id') ->where('book_author.author_id', '=', $author_id) ->where('book_author.book_id', '=', $book_id) ->get(); حيث أن التابع get سيقوم بإرجاع collection ثم بإمكانك التحقق من وجود نتائج بالشكل التالي:
    if($res->isNotEmpty()){ return true; } else{ return false; }
  15. إجابة سمير عبود سؤال في ما فائدة استخدام المصفوفة fillable في لارافل؟ كانت الإجابة المقبولة   
    المصفوفة fillable ليست إجبارية و إنما يتم إستخدامها في حالة أردنا إتاحة التعيين الجماعي لبعض الحُقول و في هذه الحالة يتم وضع هذه الحقول بداخل هذه المصفوفة.
    يمكن استخدام التابع create لحفظ سجل جديد في سطر وحيد. لكن قبل القيام بذلك، يجب أن تُعيّن أحد الخاصيات fillable بسبب حماية نماذج Eloquent افتراضيًّا من التعيين الجماعي.
    لنفترض أنه لديك النموذج User والخاصية name و أردت إنشاء كائن من هذا النموذج ثم تخزينه في قاعدة البيانات فيُمكنك ذلك كالتالي:
    public function store(Request $request) { // تحقق من الطلب.. $user = new User; $user->name = $request->name; $user->save(); } بهذا الشكل أنت لم تستخدم التعيين الجماعي و في هذه الحالة لست بحاجة لإستخدام المصفوفة fillable. أما إن قمت بالعملية بهذا الشكل:
    $user = User::create(['name' => 'John Doe']); فسيتم رمي إستثناء من النوع MassAssignmentException و السبب هنا أنك تستخدم التعيين الجماعي و لارافل ستقوم بحمايتك. الآن إن أردت أن تحمي نفسك بنفسك و تُلغي تفعيل حماية لارافل ستستخدم المصفوفة fillable او guarded فالمصفوفة fillable هي بمثابة القائمة البيضاء نضع بها الحقول التي نسمح بتعيينها جماعياً و guarded عكسها.
    هناك عدة توابع أخرى يُمكن إستعمال التعيين الجماعي معها منها update، firstOrCreate  و غيرها ..
  16. إجابة سمير عبود سؤال في اخطاء عند تنفيذ الامر npm run dev في لارافيل كانت الإجابة المقبولة   
    sass تم إجراء بعض التعديلات عليها في الإصدارات الحديثة يُمكنك تلافي المشكلة بالتعديل على ملف package.json الموافق للمشروع في إصدار الحزمة:
    "sass": "1.32.13", ثم إعادة تنفيذ:
    npm install && npm run dev  
  17. إجابة سمير عبود سؤال في هل يمكن جلب جميع الpermissions الخاصة بrole معينة؟ كانت الإجابة المقبولة   
    بالطبع بإمكانك ذلك لأنه يوجد علاقة بين النموذج Role و النموذج Permission فمثلاً إذا كان لديك:
    $admin = Role::where('name', 'admin')->first(); يُمكنك الحصول على الصلاحيات المُتاحة لهذا الدور عن طريق العلاقة permissions:
    $admin = Role::where('name', 'admin')->first(); $adminPermissions = $admin->permissions; dd($adminPermissions); و بما أنه توجد علاقة فيُمكنك عمل أي شيء تريده مثلاً إذا أردت جلب كل الأدوار و تحميل الصلاحيات بشكل حثيث يُمكنك ذلك من خلال:
    $roles = Role::whereRoleNot(['super_admin', 'admin', 'user']) ->whenSearch(\request('search')) ->with(['permissions']) ->withCount('users') ->paginate(5); و في صفحة العرض و أنت تقوم بعرض الأدوار يُمكنك عمل حلقة لصلاحيات الدور:
    @foreach($roles as $role) ... @foreach($role->permissions as $permission) ... @endforeach @endforeach  
  18. إجابة سمير عبود سؤال في كيف يمكنني إضافة middleware في بعض الmethods في route resource كانت الإجابة المقبولة   
    بإمكانك تخصيص تطبيق الطبقات الوسيطة (middlewares) في المتحكم و ذلك في الباني الخاص به مثال:
    <?php class DiscountController extends Controller { public function __construct() { $this->middleware('permission:read discount codes')->only('index'); $this->middleware('permission:add discount code')->only(['create', 'store']); $this->middleware('permission:edit discount code')->only(['edit', 'update']); $this->middleware('permission:delete discount code')->only('destroy'); } } مثلاً أنت تريد تطبيق الmiddleware auth على index فقط فتقوم بالتالي:
    $this->middleware('auth')->only('index'); و إن كنت تريد تطبيق أكثر من middleware على نفس التابع يُمكنك تمريرها على شكل مصفوفة:
    $this->middleware(['auth', 'middl2'])->only('index'); بطريقة عكسية للتابع only هناك تابع آخر يُسمى except و هو يعمل بعكس only.
  19. إجابة سمير عبود سؤال في مشكلة في ارسال ارباحي لحسابي بايبال في مستقل كانت الإجابة المقبولة   
    اعتقد أن المشكلة تكمن في تفعيل حسابك باي بال لأنه بعد ربط الحساب ببطاقة إئتمانية  سيقوم باي بال بالتأكد من ملكيتك للبطاقة من خلال استقطاع مبلغ 1.95 $ من بطاقتك الائتمانية، يجب توفير 2 $ كحد أدنى في بطاقتك، ولا تقلق سيعاد لك المبلغ لاحقا بعد انتهاء عملية التأكيد.
    بعد إتمام عملية استقطاع المبلغ عليك الذهاب لموقع البنك الخاص بك والتأكد من كشف الحساب لبطاقتك الائتمانية والحصول على رمز التأكيد المكون من أربع أرقام والذي سيكون مكتوب في بيانات عملية الشراء. 
    بعد الحصول على رمز التفعيل تعود لحسابك في باي بال وتضغط على المحفظة في القائمة، ثم تختار بطاقتك الائتمانية المراد تأكيدها، وادخل الرمز المكون من 4 أرقام وانقر على تأكيد.
    بعد تأكيد البطاقة سيفعل حسابك بشكل كامل.
    تذكر انه يُمكنك دائما التواصل مع الدعم الفني في كل من باي بال و مستقل لحل المشكلة.
  20. إجابة سمير عبود سؤال في التعامل مع أخطاء phpLaravel كانت الإجابة المقبولة   
    هناك عدة أخطاء حيث أن projects هو عبارة عن مُتغير يتم تمريره من المتحكم:
    $projects = auth()->user()->projects; في الأخير أنت تنادي على العلاقة projects لكن في النموذج User قمت بتسمية العلاقة ب project لذلك يجب تصحيح ذلك لتُصبح العلاقة:
    public function projects() { return $this->hasMany(Project::class); } أنت لا تقوم بتحديد ماهو المفتاح الثانوي في العلاقة لذلك يجب أن تحترم العُرف و تقوم بتسميته user_id و ليس users_id و في هذه الحالة لديك طريقتين:
    تغيير users_id إلى user_id في كل من ملف التهجير:
    $table->foreignId('user_id')->references('id')->on('users')->onDelete('cascade'); تنفيذ أمر التهجير:
    php artisan migrate:fresh ثم تغيير الحقل من users_id إلى user_id في مصفوفة fillable في النموذج Project ثم تغيير التابع store في المتحكم ProjectController ليُصبح:
    <?php public function store(Request $request) { $data = request()->validate([ "title" => 'required', "description" => 'required', ]); $data['user_id'] = auth()->id(); Project::create($data); return redirect('/projects'); } و بهذا الشكل ستعمل.
    الطريقة الثانية بترك الحقل كما تريد users_id لكن تحتاج إلى تغيير العلاقة بحيث تُحدد المفتاح الثانوي بهذا الشكل:
    public function projects() { return $this->hasMany(Project::class, 'users_id'); } و بطبيعة الحال تجعل الدالة store بالشكل التالي:
    <?php public function store(Request $request) { $data = request()->validate([ "title" => 'required', "description" => 'required', ]); $data['users_id'] = auth()->id(); Project::create($data); return redirect('/projects'); }  
  21. إجابة سمير عبود سؤال في اكتشاف اخطاء laravel كانت الإجابة المقبولة   
    لقد قمت بفتح ملفات مشروعك و لم أجد في صفحة المسارات إلا التالي:
    Route::get('/', function () { return view('welcome'); }); //Route::get('posts/craete', function () { // return view('posts.craete'); //}); Route::get('/', function () { return view('welcome'); }); فكما تلاحظ يوجد فقط مسار مكرر للصفحة الرئيسية و مسار آخر تم تعليقه و بالتالي لن يعمل هذا المسار.
    إذا كنت تريد أن يعمل ذلك المسار قم بحذف التعليق و أجعله:
    Route::get('posts/create', function () { return view('posts.create'); }); لأنه لديك خطأ في كتابة الكلمة create.
    ثم قم بالذهاب إلى الرابط:
    posts/create إذا ظهرت معك الصفحة 404 عليك تنفيذ الأمر:
    php artisan route:clear لحذف الكاش الخاص بالمسارات. أو تنفيذ الأمر:
    php artisan optimize:clear لحذف كل الكاش.
    و في هذه الحالة إذا ذهبت إلى الرابط
    posts/create سيظهر معك الخطأ:
    View [posts.create] not found. أي أن صفحة العرض غير موجودة و بالتالي عليك إنشاؤها بنفس الإسم create.blade.php بداخل مجلد posts و الذي بدوره يكون داخل مجلد views.
  22. إجابة سمير عبود سؤال في Laravel withMax بإضافة شرط كانت الإجابة المقبولة   
    يُمكنك عمل ذلك بإستخدام الطريقة التالية:
    $users = User::withCount(['articles as article_max_price' => function ($query) { $query->selectRaw('max(price)')->where('active', true); }])->get(); كما يُمكنك أيضاً تمرير مصفوفة للتابع withMax بحيث تستطيع عمل التالي للحصول على ما تريد:
    $users = User::withMax(['articles' => function ($query) { $query->where('active', true); }], 'price')->get();
  23. إجابة سمير عبود سؤال في استخدام scope مع العلاقات في لارافيل كانت الإجابة المقبولة   
    يبدو أنك تستدعي الدالة published في مكان آخر في الكود، لأن دالة ال scope هي available لكن في هذا الكود أنت تُطبق الدالة available على النموذج Department في حين أن الدالة تم تعريفها في النموذج User:
    هناك عدة حلول للمشكلة منها أن تقوم بالتالي:
    $departments = Department::with(['users' => function ($q) { $q->available(); }])->get(); أو إنشاء دالة في النموذج Department:
    public function availableUsers() { return $this->users()->available(); } كما يجب عليك تعديل العلاقة في النموذج Department:
    من:
    public function departments() { return $this->HasMany('User'); } إلى:
    public function users() { return $this->hasMany(User::class); } بعد ذلك عند الإستعلام تقوم بالتالي:
    $departments = Department::with('availableUsers')->get(); كما يُمكنك بالطبع نقل ال scope إلى النموذح Department بهذا الشكل:
    public function scopeAvailable($query) { return $query->whereHas('users', function ($q) { return $q->where('available', 1); }); } ثم يُمكنك إستخدامه بنفس الطريقة:
    $departments = Department::available() ->with('users') ->get();  
  24. إجابة سمير عبود سؤال في وضع شرط للمعرف ID الزوجي كانت الإجابة المقبولة   
    لنفترض أنك جلبت مجموعة من البيانات و قمت بتمريرها لصفحة العرض و لنقل أن المُتغير الذي مررته هو courses بالتالي في صفحة العرض ستقوم بعمل حلقة لعرض هذه البيانات بالشكل التالي مثلاً
    <ul class="nav flex-column"> @foreach($courses as $course) <li class="nav-item"> <a class="nav-link " href="">{{$course->title}}</a> </li> @endforeach </ul> الآن تريد تغيير طريقة العرض على حسب الid تستخدم التوجيه if الخاص ب blade بهذا الشكل:
    <ul class="nav flex-column"> @foreach($courses as $course) @if($course->id % 2 == 0) <li class="nav-item"> <a class="nav-link " href="">{{$course->title}}</a> </li> @else <li class="nav-item"> <a class="nav-link text-danger" href="">{{$course->title}}</a> </li> @endif @endforeach </ul> حيث إذا تحقق الشرط تقوم بعرض البيانات بشكل في بلوك if و إذا لم يتحقق تضع الشكل الآخر في جزء else.
  25. إجابة سمير عبود سؤال في خطأ عند إستخدام Laravel Websockets في Homestead كانت الإجابة المقبولة   
    يبدو أن المنفذ الإفتراضي الذي يتم تشغيل خادم websockets عليه من طرف الحزمة قيد التشغيل من طرف برنامج آخر أو Process آخر لذلك عليك تغييره لمنفذ لايتم إستخدامه حيث أنه يُمكن تمرير flag للأمر عن طريق --port  و تمرير المنفذ الذي تريد بهذا الشكل:
    php artisan websockets:serve --port={port} مثال:
    php artisan websockets:serve --port=3030 كما يُمكن أيضاً تغيير المنفذ من خلال ملف إعدادات الحزمة عن طريق نشر الملف ضمن مجلد الإعدادات:
    php artisan vendor:publish --provider="BeyondCode\LaravelWebSockets\WebSocketsServiceProvider" --tag="config" بعد ذلك يُمكنك تغيير السطر:
    'dashboard' => [ 'port' => env('LARAVEL_WEBSOCKETS_PORT', 6001), ], لاحظ أنه 6001 يُمكنك تغييره او إسناد قيمة ل LARAVEL_WEBSOCKETS_PORT في ملف env.
×
×
  • أضف...