Извлечение красноречивых моделей с ограничениями как на родительскую, так и на дочернюю / связанную модель - PullRequest
1 голос
/ 10 июня 2019

Я пытаюсь получить все красноречивые модели, которые соответствуют определенному полю в родительской модели ('Event') и дочерней модели ('Dates').

Я столкнулся с проблемой, из-за которой Laravelутверждает, что мое поле («дата») не существует в дочернем классе, но я не могу понять, почему.Может ли кто-нибудь указать мне правильное направление и объяснить, где я ошибся?

По сути, я пытаюсь добиться извлечения всех событий с утвержденным тегом, истинным И где дата событияопределенного дня, в данном случае 10-го.

Я немного обыскал и посмотрел некоторые примеры в документации Laravel.Я настроил модель («Событие»), чтобы иметь отношение один ко многим с моделью («даты»).Я вижу, что я могу связывать запросы друг с другом, но все становится немного запутанным, когда речь идет о нескольких моделях одновременно (в одном и том же запросе)

Это моя попытка получить данные.

public function calender()
    {
        $events = Event::where('approved', true)->with('EventDates')->whereDay('date', '10')->get();
        return view('events.calender');
    }

Это фрагмент из моей ('Event') модели.Я включил сюда только наиболее релевантную информацию, так как есть много атрибутов.

class Event extends Model
{
    //

    public function user(){
        return $this->belongsTo(User::class);
    }

    public function dates()
    {
        return $this->hasMany('App\EventDate');
    }
}

Это фрагмент из моего файла миграции модели ('EventDate'), показывающий, что 'date' действительно является полем поля('EventDate') модель.Еще раз, я только что включил здесь наиболее релевантную функцию.

class CreateEventDatesTable extends Migration
{
    public function up()
    {
        Schema::create('event_dates', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->timestamps();

            $table->date('date')->nullable();
            $table->time('startTime')->nullable();
            $table->time('endTime')->nullable();

            $table->unsignedBigInteger('event_id');
            $table->index('event_id');
        });
    }
}

Я хотел бы иметь возможность получить список соответствующих событий, для которых утвержденный атрибут имеет значение true, и событие.Даты определенного дня (xxxx-xx-10)

В настоящее время я получаю сообщение об ошибке, что столбец даты не может быть найден:

SQLSTATE [42S22]: Столбец не найден: 1054 Неизвестный столбец «дата» в «предложении где» (SQL: выберите * из events, где день (date) = 10 и approved = 1)

Ответы [ 3 ]

0 голосов
/ 10 июня 2019

Мне удалось найти способ использовать красноречивые команды, используя вместо этого конструктор DB Query, и теперь он работает (с учетом приведенного выше пункта Шанкара)

Я изменил код к этому (он немного более конкретен, чем то, что я написал ранее, но он должен быть в состоянии помочь другим решить их проблему):

for($day = 5; $day <12; $day++)
        {
            $events = DB::table('events')
                ->join('event_dates', 'events.id', '=', 'event_dates.event_id')
                ->select('events.*', 'event_dates.startTime as startTime', 'event_dates.endTime AS endTime')->where('events.approved', '=', true)->whereDay('event_dates.date', '=', $day)
                ->orderBy('event_dates.startTime', 'asc')->get();

            array_push($events_list, $events);
        }
    ```
I can't understand why the Eloquent queries couldn't find the table, but this seems to work, so for those stuck, this may be less "eloquent" but at least it works ;-;
0 голосов
/ 10 июня 2019

Я думаю, это то, что вы ищете:

    $events = Event::where('approved', true)
        ->with(['dates' => function ($query) {
            return $query->whereDay('date', '10');
        }])
        ->get();

Примечание: я предполагаю, что ваше отношение между событием и его EventDate называется dates

Таким образом, вы применяете фильтрацию по дням к связанным данным (EventDate), а не к модели Event.

0 голосов
/ 10 июня 2019

Вы должны указать имя таблицы для столбца даты.

->whereDay('event_dates.date', '10')

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...