检索对父代和子代/关联模型都具有约束的雄辩模型

时间:2019-06-10 07:33:08

标签: laravel eloquent data-retrieval

我正在尝试检索与父模型(“事件”)和子模型(“日期”)中的特定字段匹配的所有口才模型。

我遇到了一个问题,Laravel指出子字段中不存在我的字段(“日期”),但我不明白为什么。有人可以指出正确的方向,并解释我哪里出了问题吗?

本质上,我要实现的是检索所有批准标签为true且事件日期为特定日期(在本例中为第十天)的事件。

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

这是我检索数据的尝试。

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

这是我(“事件”)模型的摘录。由于属性很多,因此我仅在其中提供了最相关的信息。

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'where子句'中的未知列'date'(SQL:从events中选择*,其中day(date)= 10和{{1} } = 1)

3 个答案:

答案 0 :(得分:0)

您应该在日期列中提及表格名称。

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

答案 1 :(得分:0)

我设法通过使用“数据库查询”构建器找到了使用雄辩命令的方法,并且现在可以了(考虑到了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 ;-;

答案 2 :(得分:0)

我认为这就是您想要的:

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

注意:我假设您在一个Event和它的EventDate之间的关系称为dates

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