Как обратиться к функциям соседних моделей? Laravel

96
26 сентября 2021, 00:10

Всем привет подскажите пожалуйста как правильно обращаться к функциям соседних моделей? изначально у меня все функции были в одной модели 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')); 
 
    } 
}

Answer 1

В модели User у вас объявлена связь holiday. Это связь hasMany(один ко многим). Методы в модели принадлежат объекту. Связь hasMany возвращает коллекцию объектов.

Чтобы обратится к методу модели Holiday нужно получить объект. Например выбрать первый:

$user->holiday()->first()

у него(если он существует) можно вызвать любой публичный метод.

$user->holiday()->first()->getHolidays($id);

В вашем коде метод getHolidays избыточен. Так как делает тоже самое, что и связь

$user->holiday()->get()
READ ALSO
Баланс скобок в выражении [закрыт]

Баланс скобок в выражении [закрыт]

Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы на него можно было дать ответ, основанный на фактах и цитатах

94
Почему возвращает false. PHP

Почему возвращает false. PHP

Есть вот такая функция! Результатом curl является заголовок с редиректом на статус оплаты: Положительная https://kartonua/status/ok

238
Что нужно делать в файле config и init?

Что нужно делать в файле config и init?

Делаю что-то своего движкаБлоговый сайт, так вот в каждой странице нужно подключать файл с переменными, константами и модулями

140