检索对 parent 和 child/associated 模型都具有约束的 eloquent 模型

Retrieving eloquent models with constraints on both the parent and child/associated model

我正在尝试检索与 Parent 模型('Event')和 child 模型('Dates').

我遇到了一个问题,Laravel 指出我的字段 ('date') 在 child class 中不存在,但我可以'不明白为什么。有人可以给我指出正确的方向并解释我哪里出错了吗?

本质上,我想要实现的是检索所有事件,其中批准的标签为真,并且事件日期是特定日期,在本例中为 10 日。

我进行了一些搜索,并查看了 Laravel 文档中的一些示例。我已将 ('Event') 模型设置为与 ('dates') 模型具有一对多关系。我可以看到我可以将查询链接在一起,但是当一次处理多个模型时(在同一个查询中),事情会变得有点混乱

这是我检索数据的尝试。

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]: Column not found: 1054 Unknown column 'date' in 'where clause' (SQL: select * from events where day(date) = 10 and approved = 1)

您应该提及日期列的 table 名称。

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

我设法通过使用 DB 查询构建器找到了使用 eloquent 命令的方法,现在它可以工作了(考虑到上面 Shankar 的观点)

我把代码改成这样(比我之前写的更具体一点,但应该可以指导其他人解决他们的问题):

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 ;-;

我想这就是您要找的:

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

注意:我假设您的事件和它的 EventDate 之间的关系称为 dates

通过这种方式,您可以按天过滤相关数据 (EventDate),而不是 Event 模型。