Всем привет подскажите пожалуйста как правильно обращаться к функциям соседних моделей? изначально у меня все функции были в одной модели User
Сейчас из User часть функции ушло в Holiday и Party
Вот например функция в User в которой должны вызываться функции из Holiday и Party
public function calculate($id, $startDate, $endDate)
{
$periodDateForm = $this->getPeriodDateForm($startDate, $endDate);
$holidaysEmployee = $this->holiday->getHolidays($id);
$allDateHolidaysEmployee = $this->getDateHolidayArr($holidaysEmployee);
$allRuHolidays = $this->getApiHolidays();
$allPartyDays = $this->delPartyDays();
$allWekend = $this->weekend($startDate, $endDate);
return array_diff($periodDateForm, $allDateHolidaysEmployee, $allRuHolidays, $allPartyDays, $allWekend);
}
Как мне обратиться из User в модель Holiday за нужной мне функцией?
$holidaysEmployee = $this->holiday->getHolidays($id);
Модель User
<?php
namespace App;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\DB;
class User extends Model
{
protected $table = 'timetable_users';
protected $fillable = [
'user_id', 'morning_work_hours_from', 'morning_work_hours_before', 'afternoon_work_hours_from', 'afternoon_work_hours_before',
];
public function holiday()
{
return $this->hasMany(Holiday::class);
}
public function party()
{
return $this->hasMany(Party::class);
}
public function calculate($id, $startDate, $endDate)
{
$periodDateForm = $this->getPeriodDateForm($startDate, $endDate);
$holidaysEmployee = $this->holiday()->getHolidays($id);
$allDateHolidaysEmployee = $this->getDateHolidayArr($holidaysEmployee);
$allRuHolidays = $this->getApiHolidays();
$allPartyDays = $this->delPartyDays();
$allWekend = $this->weekend($startDate, $endDate);
return array_diff($periodDateForm, $allDateHolidaysEmployee, $allRuHolidays, $allPartyDays, $allWekend);
}
}
Модель Holiday
<?php
namespace App;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\DB;
class Holiday extends Model
{
protected $table = 'timetable_holidays';
public function user()
{
return $this->hasMany(User::class);
}
public function getHolidays($id)
{
$holidays = DB::table('timetable_holidays')
->where('user_id', '=', $id)
->get();
return $holidays;
}
public function NameHolidaysRu()
{
$apiDate = json_decode(file_get_contents('https://www.googleapis.com/calendar/v3/calendars/russian__ru%40holiday.calendar.google.com/events?key=AIzaSyC8khrJO57yl4szjLOuyQrlW7R_CKgwaH0'), 1);
$holidayDates = Arr::pluck($apiDate['items'], 'start.date');
$nameHolidayDates = Arr::pluck($apiDate['items'], 'summary');
$count = count($holidayDates);
$dateAndName = array();
for ($i = 0; $i < $count; $i++)
{
$dateAndName[] = [
"date" => $holidayDates[$i],
"name_holiday" => $nameHolidayDates[$i]
];
}
return $dateAndName;
}
public function getApiHolidays()
{
$apiDate = json_decode(file_get_contents('https://www.googleapis.com/calendar/v3/calendars/russian__ru%40holiday.calendar.google.com/events?key=AIzaSyC8khrJO57yl4szjLOuyQrlW7R_CKgwaH0'), 1);
$holidayDates = Arr::pluck($apiDate['items'], 'start.date');
$array = array_filter($holidayDates, function ($var) {
return substr($var, 0, 4) === date("Y");
});
return $array;
}
public function getDateHolidayArr($holidaysEmployee)
{
$allHolidays = array();
$count = count($holidaysEmployee);
if ($count == 0)
{
return $allHolidays;
}
for ($i = 0; $i < $count; $i++)
{
$holidaysFrom = $holidaysEmployee[$i]->holidays_from;
$holidaysBefore = $holidaysEmployee[$i]->holidays_before;
$startDate = new Carbon($holidaysFrom);
$endDate = new Carbon($holidaysBefore);
while ($startDate->lte($endDate)) {
$allHolidays[] = $startDate->toDateString();
$startDate->addDay();
}
}
return $allHolidays;
}
public function weekend($startDate, $endDate)
{
$start = strtotime($startDate);
$end = strtotime($endDate);
$result = array();
while ($start <= $end)
{
if (date('N', $start) >= 6)
{
$current = date('Y-m-d', $start);
$result[] = $current;
} $start += 86400;
}
return $result;
}
}
Контроллер
<?php
namespace App\Http\Controllers;
use App\Holiday;
use App\Party;
use App\User;
use Illuminate\Http\Request;
class TimetableController extends Controller
{
public function index()
{
$countUser = User::All()->count();
return view('timetable', compact('countUser'));
}
public function store(Request $request)
{
$rules = [
'userId'=>'required|integer|exists:timetable_users,id',
'startDate' => 'required|date',
'endDate' => 'required|date|after:startDate'
];
$this->validate($request, $rules);
$id = $request['userId'];
$startDate = $request['startDate'];
$endDate = $request['endDate'];
$user = User::findOrFail($id);
$holidays = Holiday::findOrFail($id)->where("user_id", $id)->get()->sort();
$parties = Party::all();
$countUser = User::All()->count();
$calculate = $user->calculate($id, $startDate, $endDate);
return view('timetable', compact('holidays', 'user', 'countUser', 'parties', 'calculate'));
}
}
В модели User у вас объявлена связь holiday. Это связь hasMany(один ко многим). Методы в модели принадлежат объекту. Связь hasMany возвращает коллекцию объектов.
Чтобы обратится к методу модели Holiday нужно получить объект. Например выбрать первый:
$user->holiday()->first()
у него(если он существует) можно вызвать любой публичный метод.
$user->holiday()->first()->getHolidays($id);
В вашем коде метод getHolidays избыточен. Так как делает тоже самое, что и связь
$user->holiday()->get()
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы на него можно было дать ответ, основанный на фактах и цитатах
Есть вот такая функция! Результатом curl является заголовок с редиректом на статус оплаты: Положительная https://kartonua/status/ok
Делаю что-то своего движкаБлоговый сайт, так вот в каждой странице нужно подключать файл с переменными, константами и модулями