我想知道是否可以查询刀片中的hasOne-> hasMany关系。目前,我可以使用“ $ participant-> messages-> count()”来计算刀片中有多少个模型,但是我想检查模型并计算其他事情。例如,我想在Blade中运行以下查询:
{!! $participant->messages->where($this->messages->mediaURL, "=", null)->count() !!}
我收到以下错误:
Property [mediaURL] does not exist on this collection instance.
这是我的控制器功能
public function showParticipants()
{
$participants = Participant::all();
// $messages = $participants->participant_id->messages;
return view('home')->with(['participants'=> $participants, 'messages'=>'hi']);
}
我的参与者模型的一部分:
public function messages()
{
return $this->hasMany('App\Message', 'message_id', 'participant_id');
}
我的消息模型的一部分:
public function participant()
{
return $this->belongsTo(Participant::class);
}
我的消息表结构:
public function up()
{
Schema::create('messages', function (Blueprint $table) {
$table->engine = 'InnoDB';
$table->increments('id');
$table->integer('message_id')->unsigned();
$table->string('message_content')->nullable();
$table->string('mediaSID')->index()->nullable();
$table->string('messageSID')->index()->nullable();
$table->string('mediaURL')->index()->nullable();
$table->binary('media')->nullable();
$table->string('filename')->index()->nullable();
$table->string('MIMEType')->nullable();
$table->timestamps();
});
Schema::table('messages', function($table) {
$table->foreign('message_id')->references('participant_id')->on('participants')->onDelete('cascade');
});
}
我的参与者数据库结构:
public function up()
{
Schema::create('participants', function (Blueprint $table) {
$table->engine = 'InnoDB';
$table->string('participant_id')->unique();
$table->dateTime('appointmentDate')->nullable();
$table->dateTimeTz('timezoneOffset')->nullable();
$table->dateTime('appointmentDate_twoWeeks')->nullable();
$table->dateTime('notificationTime')->nullable();
$table->integer('notificationTally')->nullable();
$table->boolean('studyCompleted')->default(0);
$table->boolean('subscribed');
$table->timestamps();
});
}
我的刀片只是提供所有信息:
@isset($participants)
@foreach ($participants as $participant)
<tr>
<td>
{!! $participant->participant_id !!}
</td>
<td>
{!! $participant->subscribed !!}
</td>
<td>
{!! $participant->notificationTime !!}
</td>
<td>
{!! $participant->notificationTally !!}
</td>
<td>
{!! $participant->studyCompleted !!}
</td>
<td>
{!! $participant->messages->count() !!}
</td>
<td>
{!! $participant->messages->where($participant->messages->mediaURL, "=", null)->count() !!}
</td>
</tr>
@endforeach
@endisset
答案 0 :(得分:0)
我认为问题是$this->messages->mediaURL
。使用查询生成器,如果您要引用表中的列,则只需将其传递一个字符串即可。同样,当您查询关系时,您应该使用方法而不是属性,例如$participant->messages()
。最后,查询空列时,可以使用whereNull
方法。
{!! $participant->messages()->whereNull('mediaURL')->count() !!}
答案 1 :(得分:0)
您正在对返回集合的消息使用“魔术” __get(),因为它与集合有很多关系。
$participant->messages->where($this->messages->mediaURL, "=", null)->count()
应该是
$participant->messages()->where($participant->messages()->first()->mediaURL, "=", null)->count()