Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 14.09.2017 16:24:38

Запрос к отношению

Есть таблицы

users
    id - integer
    name - string

order_users
    id - integer
    user_id - integer
    day_id - integer
    amount - integer

order_days
    id - integer	
    date - date

отношения

class User extends Model
{
  public function orders() {
        return $this->hasMany('App\Models\OrderUser', 'user_id');
  }
}	
...
class OrderUser extends Model
{    
    public function day() {
        return $this->belongsTo('App\Models\OrderDay', 'day_id', 'id');
    }

    public function user() {
        return $this->belongsTo('App\User', 'user_id', 'id');
    }

}

Вопрос: мы получили всех пользователей с именем Иван:

$users = \App\User::where('name', 'Иван')->get();

Как теперь для каждого из них получить общую сумму, за работу с 1.09 по 3.09?

Не в сети

#2 14.09.2017 16:31:04

Re: Запрос к отношению

Я бы сделал через Constraining Eager Loads
https://laravel.com/docs/5.5/eloquent-relationships

$users = App\User::with(['posts' => function ($query) {
    $query->where('title', 'like', '%first%');
}])->get();

И ты на выходе получишь группу объектов юзеров с доп полем заработок и конкретно суммой для каждого....

Изменено adams (14.09.2017 16:32:34)

Не в сети

#3 14.09.2017 16:56:24

Re: Запрос к отношению

Дело в том, что мне нужно в шаблоне по каждой дате потом выводить сумму заработка, чтобы срабатывало вот так примерно:

$user->days->filter(function ($day) {return $day->date == '2017-09-01';})->users->sum('amount')

Есть еще одно отношение

class User extends Model
{
public function days() {
   return $this->belongsToMany('App\Models\OrderDay', 'order_users', 'user_id', 'day_id');
}

Не в сети

#4 14.09.2017 17:28:52

Re: Запрос к отношению

Ну так в доп поле к каждому юзеру например test может лежать массив где ключ это дата, а значение - заработок.

Не в сети

#5 14.09.2017 18:03:07

Re: Запрос к отношению

А зачем ты дату хранишь в отдельной таблице, если там отношение belongsTo? Храни дату в order_users (намного лучше переименовать в orders) и получай данные:

$users = \App\User::where('name', 'Иван')
    ->with(['orders' => function ($q) use ($from, $to) {
        $q->whereBetween('date', [$from, $to]);
    }])
    ->get();

Ну а для текущей структуры, можно сделать так:

$users = \App\User::where('name', 'Иван')
    ->with(['orders' => function ($q) use ($from, $to) {
        $q->whereHas('day', function ($q) use ($from, $to) {
            $q->whereBetween('date', [$from, $to]);
        });
    }])
    ->get();

Изменено AlexeyMezenin (14.09.2017 18:29:21)

Не в сети

Подвал раздела