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

سمير عبود

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

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

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

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

    34

كل منشورات العضو سمير عبود

  1. بدل السطر التالي: ->addSelect( DB::raw('date_add(formations.date_fin, interval formations.duree_validite month) as date_recyclage')) إستخدم: ->selectRaw( 'alertes.*, date_add(formations.date_fin, interval formations.duree_validite month) as date_recyclage') السبب في ذلك أنك تستطيع استخدام التابع addSelect إن كان لديك نسخة منشئ استعلامات مسبقًا ورغبت في إضافة عمود آخر لأعمدة Select الحالي لكنه ليس لديك select لذلك فالناتج هو عمود واحد فقط. و في هذه الحالة يُمكن استخدام طريقة selectRaw بدلاً من addSelect (DB :: raw (...)).
  2. لا يُمكن نشر مقال بدون صلاحية لفعل ذلك، تجدين في هذه الصفحة: أكتب معنا كافة الإرشادات و الإجراءات اللازمة لكيفية المساهمة في نشر المقالات، فشركة حسوب تنشر بإستمرار على منصة مستقل مشاريع لكتابة و ترجمة مقالات للأكاديمية إن كنتِ مهتمة بذلك يُمكنك متابعة هذه المشاريع و التقديم عليها و إن وجدو أنك شخص مُناسب لتلك المهمة أو المشروع سيتواصلون معك، بالتوفيق.
  3. أحد الطرق المُمكنة لتحقيق ذلك هي إستخدام نطاق خاص في النموذج User بالشكل التالي: protected $fields = ['id','pseudo','email']; // add all fields from your table public function scopeExclude($query, $excludes = []) { return $query->select(array_diff($this->fields, (array) $excludes)); } ثم في المُتحكم يُمكنك عمل: <?php $users = User::where([ ['gender', '=', 'M'], ['is_active', '=', 1], ])->exclude(['pseudo', 'email', 'created_at']) ->toArray();
  4. مرحباً مها، في الحالات العادية بعد إنهاء الطالب كافة مسارات الدورة يقوم بالتقديم على الإمتحان من خلال التواصل مع فريق الدعم عن طريق فتح تذكرة عبر مركز المساعدة لحجز موعد لإجراء الإمتحان، لكل بخصوص طلبة منحة البنك الدولي لم يتم إعلامنا بالإجراءات لا ندري هل سيتبعون نفس الإجراءات أم إجراءات أخرى، حالياً عليك التركيز في فهم مسارات الدورة و بعد ذلك لكل حادث حديث تأكدي أنه يُمكنك في أي وقت التواصل مع فريق الدعم و سيوضحون لك أي شيئ ترغبين به. بالتوفيق.
  5. يبدو أنك تستدعي الدالة 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();
  6. بإمكانك إنشاء دالة تقبل المفتاح و القيمة الجديدة بالشكل التالي: public function setEnvironmentValue($envKey, $envValue) { $envFile = app()->environmentFilePath(); $oldValue = env($envKey); if (file_exists($envFile)) { file_put_contents($envFile, str_replace( "{$envKey}={$oldValue}", "{$envKey}={$envValue}", file_get_contents($envFile) )); } } مثال للإستخدام: $this->setEnvironmentValue('APP_ENV', 'production');
  7. بإمكانك إستخدام التابع withCount لتحقيق ذلك: Hackathon::withCount('participants') ->orderBy('participants_count', 'desc') ->paginate(10); // or ->take(10) إذا كنت تريد جلب العشر الأوائل في الترتيب كما يُمكنك إستخدام join أيضاً كما هو موضح أدناه: $hackathons = Hackathon::leftJoin('hackathon_user','hackathons.id','=','hackathon_user.hackathon_id') ->selectRaw('hackathons.*, count(hackathon_user.hackathon_id) AS `participants_count`') ->groupBy('hackathons.id') ->orderBy('participants_count','DESC') ->paginate(10);
  8. يُمكنك زيادة عُمر الجلسة فالمدة الإفتراضية لإنتهاء الصلاحية هي ساعتان: و التعديل يكون من خلال الملف config/session.php: /* |-------------------------------------------------------------------------- | Session Lifetime |-------------------------------------------------------------------------- | | Here you may specify the number of minutes that you wish the session | to be allowed to remain idle before it expires. If you want them | to immediately expire on the browser closing, set that option. | */ 'lifetime' => env('SESSION_LIFETIME', 120), والوحدة هي الدقيقة يُمكنك تغييرها إلى 6 ساعات أو يوم بالشكل التالي: 'lifetime' => env('SESSION_LIFETIME', 360), // 6 ساعات // أو 'lifetime' => env('SESSION_LIFETIME', 60 * 24), // يوم أو من خلال ملف env. SESSION_LIFETIME=360
  9. لطباعة الإستعلام يُمكنك إستخدام أحد الطرق التالية: التابع toSql: <?php $query = User::select("*")->toSql(); dd($query); الخرج: select * from `users` أما إذا أردت إستخدام DB::getQueryLog فتحتاج إلى تفعيل الخاصية لأنها تكون غير مُفعلة إفتراضياً: <?php use App\Models\User; use DB; DB::enableQueryLog(); $users = User::select("*")->get(); $quries = DB::getQueryLog(); dd($quries); الخرج: array:1 [▼ 0 => array:3 [▼ "query" => "select * from `users`" "bindings" => [] "time" => 4.25 ] ]
  10. يمكنك استخدام Rule :: unique لتحقيق قاعدة التحقق الخاصة بك: <?php $messages = [ 'data.ip.unique' => 'Given ip and hostname are not unique', ]; Validator::make($data, [ 'data.ip' => [ 'required', Rule::unique('servers')->where(function ($query) use($ip,$hostname) { return $query->where('ip', $ip) ->where('hostname', $hostname); }), ], ], $messages); أو بهذا الشكل في الإصدارات الجديدة <?php $request->validate([ 'ip' => [ 'required', Rule::unique('servers')->where(function ($query) use($ip,$hostname) { return $query->where('ip', $ip) ->where('hostname', $hostname); }), ], ]); أو إنشاء صنف request جديد ثم تضع القواعد بنفس الطريقة أعلاه.
  11. يمكنك تعديل المسار الذي تُعيده الدالة public_path من خلال الملف index.php الموجود في مجلد public بهذا الشكل: <?php $app->bind('path.public', function() { return __DIR__; }); حيث سيقترن المسار الذي تُعيده الدالة public_path بمسار المُجلد الحاوي للملف index.php.
  12. أثناء عملية التحديث تحتاج إلى تجاهل السجل الحالي الذي تقوم بتحديثه بخصوص القاعدة unique حتى لا يتم إحتسابه و ذلك من خلال إضافة مُعرف السجل للقاعدة بهذا الشكل: $request->validate([ 'name' => ['required', 'string', 'max:255'], 'email' => ['required', 'string', 'email', 'max:255', 'unique:users,email,' . $user->id], 'username' => ['required', 'string', 'alpha_dash', 'max:190', 'unique:users,username,' . $user->id], ]); او بهذا الشكل: $request->validate([ 'name' => ['required', 'string', 'max:255'], 'email' => ['required', 'string', 'email', 'max:255', Rule::unique('users','email')->ignore($user->id)], 'username' => ['required', 'string', 'alpha_dash', 'max:190', Rule::unique('users','username')->ignore($user->id)], ]); و الآن ستتمكن من تطبيق القاعدة unique بدون أية مشاكل أثناء التحديث.
  13. السبب في ذلك أن لارافيل يعتمد على التشفير من نوع bcrypt إفتراضيا فحتى لو قمت بتسجيل المُستخدم بإستخدام sha1 عند تسجيل الدخول سيتم مطابقة كلمة المرور بإستخدام bcrypt، تدعم لارافيل ثلاث أنواع من التشفير: "bcrypt", "argon", "argon2id" لإضافة التشفير sha1 و إعتماده يُمكنك إستخدام الطريقة التالية: أولاً ، سننشئ مجلدًا فرعيًا في مجلد app يسمى Libs أو Libaries أو أيًا كان ما تريد تسميته. في هذا المجلد ، قم بإنشاء مجلد يسمى CustomHash حيث نقوم بتخزين جميع أنواع التشفير الخاصة بك فيه. يعتمد Namespace على أسماء المجلدات التي اخترتها. تقوم بإنشاء صنف Sha1Hasher داخل المُجلد الذي أنشأته و ترث من الصنف AbstractHasher و تُطبق الواجهة: HasherContract: <?php namespace App\Libs\CustomHash; use Illuminate\Contracts\Hashing\Hasher as HasherContract; use Illuminate\Hashing\AbstractHasher; class Sha1Hasher extends AbstractHasher implements HasherContract { public function make($value, array $options = array()) { return sha1($value); } public function check($value, $hashedValue, array $options = array()) { return $this->make($value) === $hashedValue; } public function needsRehash($hashedValue, array $options = array()) { return false; } } من خلال مزود الخدمة AppServiceProvider نقوم بعمل extent للكلاس Hash في الدالة boot: Hash::extend("sha1", function($app) { return new Sha1Hasher(); }); و لا تنسى إستدعاء الكلاس فوق: use App\Libs\CustomHash\Sha1Hasher; بعد ذلك تحتاج إلى تعديل نوع التشفير من bcrypt إلى sha1 من خلال config/hashing.php: 'driver' => 'sha1',
  14. يتم استخدام رمز النجمة (*) للتحقق من القيم في المصفوفة ، وليس المصفوفة نفسها. $validator = Validator::make($request->all(), [ "names" => "required|array|min:3", "names.*" => "required|string|distinct|min:3", "description" => "required|string" ]); في المثال أعلاه: "names" يجب أن تكون مصفوفة تحتوي على 3 عناصر على الأقل ، يجب أن تكون القيم في مصفوفة "names" عبارة عن سلاسل مميزة (فريدة) ، بطول 3 أحرف على الأقل. ملاحظة: منذ Laravel 5.5 يمكنك استدعاء التابع validate مباشرة على كائن Request مثل: $data = $request->validate([ "names" => "required|array|min:3", "names.*" => "required|string|distinct|min:3", "description" => "required|string" ]);
  15. أولاً اقرأ التحذير! يقول لا تقم بتشغيل composer كجذر! ثانيًا ، من المحتمل أنك تستخدم Xammp على موقعك المحلي الذي يحتوي على مكتبات php المطلوبة بشكل افتراضي. ولكن في الخادم الخاص بك لا يوجد مكتبة ext-dom. يحتوي php-xml على جميع الحزم ذات الصلة التي تحتاجها. لذلك ، يمكنك ببساطة تثبيته عن طريق تشغيل: sudo apt-get update sudo apt install php-xml على الأرجح أنك تفتقد mbstring أيضًا على الخادم. إذا تلقيت خطأ بسببها ، فثبّت هذه الحزمة أيضًا باستخدام: sudo apt-get install php-mbstring بعد ذلك قم بتنفيذ: composer update composer require cviebrock/eloquent-sluggable
  16. يُمكنك إضافة الخاصية التي تريدها في النموذج بإضافة موصل (accessor): public function getAvailabilityAttribute() { return $this->calculateAvailability(); } ثم تضيف الخاصية إلى مصفوفة appends protected $appends = ['availability']; ليُصبح النموذج بهذا الشكل: class EventSession extends Eloquent { protected $table = 'sessions'; protected $appends = ['availability']; public function getAvailabilityAttribute() { return $this->calculateAvailability(); } } و الآن يُمكن الوصول للخاصية عند تحميل النموذج.
  17. بإمكانك إنشاء تابع جديد في النموذج User بهذا الشكل: public function sortedComments() { return $this->hasMany('Comment')->orderBy('post_id'); } و عند عرض التعليقات تقوم بالتالي: foreach($post->user->sortedComments as $comment) { echo "<li>" . $comment->title . " (" . $comment->post->id . ")</li>"; } أو يُمكنك ترتيب التعليقات في المُتحكم و تمريرها لصفحة العرض: $comments = auth()->user() ->comments() ->orderBy('post_id') ->get(); return view('view.name', compact('comments')); // و في صفحة العرض تقوم بإستخدام المُتغير comments في صفحة العرض: @foreach($comments as $comment) <li>{{ $comment->title }} ({{ $comment->post_id }})</li> @endforeach
  18. يُمكنك طباعة الإستعلام الذي يتم تنفيذه عن طريق إستخدام التابع toSql كما هو موضح أدناه: DB::table('users')->toSql(); // أو User::toSql(); فمثلا إن كنت تريد طباعة الإستعلام لهذا الكود: User::where('id', '<', 10)->get(); تقوم بالتالي: User::where('id', '<', 10)->toSql();
  19. يُمكنك ببساطة إستخدام التابع updateOrCreate في هذه الحالة: $model = RepairItem::find($id); if (!empty($temp = $request->input('option'))) { $model->option() ->updateOrCreate( ['repair_item_id' => $model->id], ['option' => $temp] ); } كما يُمكنك ذلك بهذا الشكل: $model = RepairItem::find($id); if (!empty($temp = $request->input('option'))) { $option = $model->option; if(empty($option)){ $option = $model->option()->create(); } $option->someAttribute = temp; $option->save(); };
  20. يُمكنك إستخدام التالي : في المتحكم: return redirect()->back()->with('msg', 'your message here'); // او في الإصدارات الحديثة return back()->with('msg', 'your message here'); في صفحة العرض تقوم بالتالي: @if (\Session::has('msg')) <div class="alert alert-success"> <p>{!! \Session::get('msg') !!}</p> </div> @endif أو: @if (session()->has('msg')) <div class="alert alert-success"> <p>{{ session('msg') }}</p> </div> @endif
  21. يُمكنك إضافة قيد على مُستوى قاعدة البيانات في جدول photos: في الإصدارات القديمة: $table->unsignedInteger('user_id'); $table->foreign('user_id') ->references('id') ->on('users') ->onDelete('cascade');; في الإصدارات الحديثة تم إختصار العملية بهذا الشكل: $table->foreignId('user_id') ->constrained() ->onDelete('cascade'); // أو $table->foreignId('user_id') ->constrained() ->cascadeOnDelete(); // او $table->foreignId('user_id') ->constrained('users') // تضع إسم الجدول إن لم تقم بإحترام القاعدة في تسمية الجداول و المفاتيح ->cascadeOnDelete();
  22. إن كان الهدف هو إرجاع سجل واحد فالأفضل إستخدام التابع find او first او findOrFail او firstOrFail لأن get تُعيد مجموعة سجلات حتى و لو كانت النتيجة هي سجل واحد فستُعيد السجل بداخل مصفوفة: $about = Page::where('page', 'about-me')->first(); $about = Page::where('page', 'about-me')->firstOrFail(); // إرجاع الصفحة 404 في حالة عدم وجود أي سجل $about = Page::find(3); // إبحث عن السجل ذو المعرف 3 $about = Page::findOrFail(3); // إرجاع الصفحة 404 في حالة عدم وجود أي سجل
  23. يُمكنك الحصول على تلك النتيجة بإستخدام الكود التالي: $from = $to = Reservation::whereBetween('reservation_from', [$from, $to])->get(); أو: $from = $to = $reservations = Reservation::whereRaw( "(reservation_from >= ? AND reservation_from <= ?)", [$from, $to] )->get();
  24. يُمكنك الحصول على تلك النتيجة بإستخدام التالي: <?php $user_info = DB::table('usermetas') ->select('browser', DB::raw('count(*) as total')) ->groupBy('browser') ->get(); او إستخدام التالي: <?php $user_info = DB::table('usermetas') ->select('browser', DB::raw('count(*) as total')) ->groupBy('browser') ->pluck('total','browser') ->all(); و في هذه الحالة ستكون النتيجة عبارة عن مصفوفة ترابطية حيث اسم المتصفح هو المفتاح و العدد الكلي هو القيمة: [ "browser 1" => 2, "browser 2" => 4, "browser 3" => 4, // ... // ... ]
  25. يُمكنك إستخدام التالي للتحقق من أن المجموعة ليست فارغة: if ($result->isNotEmpty()) { // التحقق من أن المجموعة ليست فارغة // } // أو if (!$result->isEmpty()) { // التحقق من أن المجموعة ليست فارغة // } او التالي لحساب أو إرجاعة عناصر المجموعة: $result->count(); أما إن كنت تستخدم الترقيم و إرجاع النتائج على شكل صفحات: $result->total();
×
×
  • أضف...