向模型添加自定义函数以检索特定数据

时间:2017-03-21 20:02:45

标签: laravel laravel-5.4

我正在建立一个应用程序来评估幼儿园的孩子们。 (我的妻子是托儿所老师)。这是基本模型和关系:

class Subevaluation extends Model
{
    // fields: id, title, date, classroom, course_id
    public function subevaluations(){
       return $this->hasMany('App\Subevaluation');
    }
}

class Evaluation extends Model
{
    // fields: id, child_id, evaluation_id, quotation
    public function evaluation(){
       return $this->belongsTo('App\Evaluation');
    }
}

我的应用程序中有更多模型(儿童,课堂......),但上述2是此问题的重要模型。

现在我可以检索一个选定评估的所有子评估;例如:

$eval = App\Evaluation::find(1);

$subevals = $eval->subevaluations;

在我看来,我可以列出所有的子评估:

@foreach($eval->subevaluations as $subeval)

  <td> {{ $subeval->student->name }}</td>
  <td> {{ $subeval->date }}</td>
  <td> {{ $subeval->quotation }}</td>

@endforeach

我的问题出现了:(鼓号......)

我希望能够列出针对此特定评估/课程的最后5个引文。所以,在@foreach循环中,我想要某种函数,如{{$ subeval-&gt; last5quotations}},它返回一个如下数组:

array{
  {
    'quot' => 'A',
    'date' => '2017-03-01',
    'info' => 'info here'
  },
  {
    'quot' => 'C',
    'date' => '2017-02-14',
    'info' => 'info here'
  },
  {
    'quot' => 'A',
    'date' => '2017-01-30',
    'info' => 'info here'
  },
  {
    'quot' => 'B',
    'date' => '2016-12-04',
    'info' => 'info here'
  },
  {
    'quot' => 'A',
    'date' => '2016-11-20',
    'info' => 'info here'
  }
}

这个数组(或者可以是集合)具有给每个孩子的最后5个引用 - 课程

然后我可以循环播放此数组,在视图中显示此信息

我怎样才能在Laravel中实现这一目标? (第5.4版)

谢谢!

2 个答案:

答案 0 :(得分:0)

继续你的例子,你可以通过以下方式实现这一目标:

class Evaluation extends Model
{
    public function subevaluations()
    {
        return $this->hasMany(Subevaluation::class);
    }
}

$eval = App\Evaluation::find(1);
$last5subevals = $eval->subevaluations()->latest('date')->limit(5);

函数latest($column = 'created_at')按&#34;添加&#34;顺序查询时间戳的子句。 limit($value)应该是不言自明的(将LIMIT 5添加到由这些函数创建的SQL查询中。)

以下是有关Laravel的更多相关信息: https://laravel.com/docs/5.4/queries#ordering-grouping-limit-and-offset

答案 1 :(得分:0)

您可以直接向关系添加查询约束。

$subevals = $eval->subevaluations()->latest('date')->take(5);

请注意,我将关系称为方法而不是属性。此外,latest()范围将按date排序,take(5)等同于SQL LIMIT 5