Я не получаю все данные, которые вставлены между двумя датами. например, дата начала: 2017-01-15 – 2018-05-15: дата окончания.
Я хочу получить всю заработную плату людей, которые работали над конкретным проектом в течение этого периода времени, и мой код до сих пор:
$project = Project::find($project_id); $projectStartDate = $project->start_date; $projectEndDate = $project->end_date; $usersOfProject = $project->users()->get(); foreach ($usersOfProject as $userOfProject){ $ids = $userOfProject->id; $userWages = UserWage::where('user_id',$ids)->where('start_date','<=', $projectStartDate)->where('end_date','>=',$projectEndDate)->get(); foreach ($userWages as $userWage){ $wage= wage + $userWage->value; return $wage; } }
когда я dd($ids);
он показывает только 1 пользователь, который работает над проектом, а не все из них. (в настоящее время два работают над ним).
заполняемые поля для UserWages:
protected $fillable = [ 'value', 'currency', 'user_id', 'start_date', 'end_date', ];
, Проекты:
protected $fillable = [ 'name', 'description', 'start_date', 'end_date', 'value', 'client_id','currency','', ];
, Пользователь:
protected $fillable = [ 'email', 'password', 'first_name', 'last_name', 'status_id','mobile', 'role', ];
Цель всего этого в том, что я пытаюсь получить заработную плату каждого пользователя, который работал над этим проектом во время начала и конца проекта. Заработная плата может меняться от месяца к месяцу, и поэтому обменный курс (оплата может быть произведена в долларах США, евро или албанском леке);
Я пытаюсь получить всю заработную плату пользователей, которые являются частью проекта, и рассчитывать данные за каждую оплату, которую они могли бы иметь. с обменным курсом этого месяца, обменный курс может быть заполнен администратором.
код для курса обмена:
function exchangeRate($value, $currency){ $getCurrency = Exchange::whereDate('date','2017-11-30'); //This is just for test to calculate wages with exchange rate of november 30, will do with carbon to get last date of month. $dollar = $getCurrency->dollar_lek; $euro = $getCurrency->euro_lek; if ($currency == 'ALL') { $value = $value; } elseif ($currency == 'USD') { $value = $value * $dollar; } else { $value = $value * $euro; } }
заполняемые для обмена валюты
protected $fillable =[ 'euro_lek', 'dollar_lek', 'date', ];
Я думаю, что я нашел, что не так. Вы должны использовать whereIn для получения всех зарплат пользователей.
Измените это:
$project = Project::find($project_id); $projectStartDate = $project->start_date; $projectEndDate = $project->end_date; $usersOfProject = $project->users()->get(); foreach ($usersOfProject as $userOfProject){ $ids = $userOfProject->id; $userWages = UserWage::where('user_id',$ids)->where('start_date','<=', $projectStartDate)->where('end_date','>=',$projectEndDate)->get(); foreach ($userWages as $userWage){ $wage= wage + $userWage->value; //it should be pushed into array and not returning single value. return $wage; }
}
В этом:
$project = Project::find($project_id); $projectStartDate = $project->start_date; $projectEndDate = $project->end_date; $wages = array(); $usersOfProject = $project->users()->get(); foreach ($usersOfProject as $userOfProject){ $userWages = UserWage::whereIn('user_id',$usersOfProject>pluck('id')->toArray())->where('start_date','<=', $projectStartDate)->where('end_date','>=',$projectEndDate)->get(); foreach ($userWages as $userWage){ $wage= wage + $userWage->value; array_push($wages, $wage); } } return $wages;
Я бы сделал это по-другому:
$project = Project::find($project_id); $projectStartDate = Carbon::parse($project->start_date)->startOfDay(); $projectEndDate = Carbon::parse($project->end_date)->endOfDay(); $usersOfProject = $project->users()->get(); $userWages = UserWage::whereIn('user_id',$usersOfProject->pluck('id')->toArray())->whereBetween('start_date',[ $projectStartDate,$projectEndDate])->whereBetween('end_date',[ $projectStartDate,$projectEndDate])->get(); $wages = []; foreach ($userWages as $userWage){ $wage= wage + $userWage->value; array_push($wages,$wage); } dd($userWages,$wages);