Laravel 5.5-刀片模板,更深入地查询hasMany关系

时间:2018-08-16 21:55:19

标签: laravel laravel-5 eloquent relational-database laravel-blade

我想知道是否可以查询刀片中的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

2 个答案:

答案 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()