سلام خسته نباشید چطور می تونم این if ها رو تعدادشو کمتر کنم : منظورم اینه راهی داره که این کد ها رو ساده تر کنم ؟؟ هر چی پروژه بزرگتر میشه این کدها یکم ساختارشون بدتر میشه ؟؟
if ($result->ffield->faculty->university->country->name == $country)
{
if ($langLevel >= $result->iov)
{
if ($money >= $result->ytuimin)
{
if ($gpabachelor < 14)
{
if ($this->avg($result->gpa, $result->gpaof) <= 14)
{
if ((($gre == 0) and ($result->grereq == 0)) or (($gre == 1) and ($result->grereq == 0)) or (($gre == 1) and ($result->grereq == 1)))
{
if ((($gmat == 0) and ($result->gmatreq == 0)) or (($gmat == 1) and ($result->gmatreq == 0)) or (($gmat == 1) and ($result->gmatreq == 1)))
{
if (($canadaState == 'no') or (($canadaState == 'yes') and ($result->ffield->faculty->university->state == $state)))
{
$firstStep[] = $result->toArray();
$g = Grade::getGrade($result->grade_id);
$firstStep[$i]['grade'] = $g;
$firstStep[$i]['type'] = 'University';
$i++;
}
}
}
}
}
elseif ($gpabachelor >= 14)
{
if ($this->avg($result->gpa, $result->gpaof) <= $gpabachelor)
{
if ((($gre == 0) and ($result->grereq == 0)) or (($gre == 1) and ($result->grereq == 0)) or (($gre == 1) and ($result->grereq == 1)))
{
if ((($gmat == 0) and ($result->gmatreq == 0)) or (($gmat == 1) and ($result->gmatreq == 0)) or (($gmat == 1) and ($result->gmatreq == 1)))
{
if (($canadaState == 'no') or (($canadaState == 'yes') and ($result->ffield->faculty->university->state == $state)))
{
$firstStep[] = $result->toArray();
$g = Grade::getGrade($result->grade_id);
$firstStep[$i]['grade'] = $g;
$firstStep[$i]['type'] = 'University';
$i++;
}
}
}
}
}
}
}
elseif ($langLevel < 6.5)
{
if ($money >= $result->ytuimin)
{
if ($gpabachelor < 14)
{
if ($this->avg($result->gpa, $result->gpaof) <= 14)
{
if ((($gre == 0) and ($result->grereq == 0)) or (($gre == 1) and ($result->grereq == 0)) or (($gre == 1) and ($result->grereq == 1)))
{
if ((($gmat == 0) and ($result->gmatreq == 0)) or (($gmat == 1) and ($result->gmatreq == 0)) or (($gmat == 1) and ($result->gmatreq == 1)))
{
if (($canadaState == 'no') or (($canadaState == 'yes') and ($result->ffield->faculty->university->state == $state)))
{
if ($result->pathway == 1)
{
$firstStep[] = $result->toArray();
$g = Grade::getGrade($result->grade_id);
$firstStep[$i]['grade'] = $g;
$firstStep[$i]['type'] = 'University';
$i++;
}
}
}
}
}
}
elseif ($gpabachelor >= 14)
{
if ($this->avg($result->gpa, $result->gpaof) <= $gpabachelor)
{
if ((($gre == 0) and ($result->grereq == 0)) or (($gre == 1) and ($result->grereq == 0)) or (($gre == 1) and ($result->grereq == 1)))
{
if ((($gmat == 0) and ($result->gmatreq == 0)) or (($gmat == 1) and ($result->gmatreq == 0)) or (($gmat == 1) and ($result->gmatreq == 1)))
{
if (($canadaState == 'no') or (($canadaState == 'yes') and ($result->ffield->faculty->university->state == $state)))
{
if ($result->pathway == 1)
{
$firstStep[] = $result->toArray();
$g = Grade::getGrade($result->grade_id);
$firstStep[$i]['grade'] = $g;
$firstStep[$i]['type'] = 'University';
$i++;
}
}
}
}
}
}
}
}
}
}
فکر میکنم اگه از when استفاده کنید بتونید کد رو مرتب تر بنویسید.
اینم نمونه:
$query = Author::query();
$query->when(request('filter_by') == 'likes', function ($q) {
return $q->where('likes', '>', request('likes_amount', 0));
});
$query->when(request('filter_by') == 'date', function ($q) {
return $q->orderBy('created_at', request('ordering_rule', 'desc'));
});
چند تا راه هست.
راه اول: یه عده میاند این همه condition رو میذارند داخل یه متد و متد رو هم توی یه Trait .. که اصطلاحا بهش میگن آشغال ها رو زیر فرش قایم کردن.
راه دوم: (راهی که خودم هم بیشتر میپسندم) ساخت یه کلاس جدا (مثلا Filters) برای چک کردن انواع فیلتر هاست.. اگر در تمام متدهاش this رو return کنیم. میتونیم متدهارو به همدیگه Chain کنیم و تمام کاندیشن ها رو در یک خط پیاده کنیم.
این کلاس حتی میتونه از یه کلاس Abstract ارث بری کنه.. و یا حتی بهتر از قوانین یه Interface تبعیت کنه و این طوری میتونی کلاس های مختلفی برای انواع چک کردن ها بوجود بیاری که همه از یه سری قوانین تبعیت میکنند و یه سری عملکردها رو به طور حتم در خودشون دارند..
راه سوم: استفاده از یک متد (که در واقع لینکی هست به کلاس دیگری) داخل مدل مربوط به داده ها. مثلا اگر قرار مواردی رو از مدل User چک کنید که مربوط به رشته اون کاربر میشه... در مدل User یه متد میذارید به نام Field و Instance کلاس رو بهش پاس میدیم :
public function field() {
return new Field($this);
}
کلاس Field میتونه شبیه زیر باشه:
class Field {
protected $user;
public function __construct($user) {
$this->user = $user;
}
public function Country() {
return $this->user->userRelationShipsWorkHere();
}
public function Masters() {}
...
}
برای کاندیشنهای خاص هم میتونی متد های جدید معرفی کنی
راه چهارم: استفاده از Local Scope ها در الکوئنت شاید بتونه در مرتب کردن این کدها مقداری کمک کنه
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟