检索对 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
模型。
我正在尝试检索与 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 andapproved
= 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
模型。