Laravel:根据条件搜索关系并检索记录

时间:2020-11-04 17:11:30

标签: php laravel eloquent laravel-query-builder

我在学校数据库中有一些相关表格。我有学生,StdAct和事务。学生每年都有一个帐户。因此,一个学生可能有很多帐户(基于年份和年级)。例如:学生(id:2)可能拥有以下帐户

  • StdAct(id:10,student_id:2,年:2018,年级:10th)
  • StdAct(id:23,student_id:2,年:2019,年级:11th)
  • StdAct(id:53,student_id:2,年份:2020,年级:12th)。等等。

一个StdAct可能有很多事务。例如,StdAct(id:10,年份:2018,等级:10th)可能有以下交易:

  • 交易额(id:110,act_id:10,Amount:20 $,Created_at:2020-10-10)
  • Tran(id:340,act_id:10,Amount:40 $,Created_at:2020-11-10)..依此类推。

我想打印这样的报告:

商品标准名称Tran(金额)日期

  • 1约翰20 $ 2020-10-10
  • 2约翰40 $ 2020-11-10
  • 3丹尼斯44 $ 2020-11-02

以此类推。

鉴于(年份和年级),我想根据用户(年份和年级)的输入来搜索并找到所有具有相关交易和相关学生姓名的StdAct。

我可能还需要根据给定的两个日期(用户输入)生成相同的报告。因此,我将搜索两个给定日期之间的交易,并找到相关的StdAct和学生(我们需要std_name)。

这是我的模特

class StdActs extends Model
{
    //
    protected $table = 'StdActs';

    public function student()
    {
        return $this->belongsTo('App\Students', 'student_id');
        //return $this->belongsTo('App\Students', 'id');
    }


    public function transactions()
    {
        return $this->hasMany('App\Transactions','act_id');
    }

}

class Students extends Model
{
    protected $table ='Students';

    public function StdActs()
    {
        return $this->hasMany('App\StdActs', 'student_id', 'id');
    }
}

class Transactions extends Model
{
    protected $table = 'Transactions';

    public function StdAct()
    {
        return $this->belongsTo('App\StdActs');
    }
}

注意: 我尝试了一些类似的情况(但不是我在上面询问的情况),如下所示:

$stdActs = StdActs::whereHas('student', function($query){
    $query->where ('std_name', 'like' , '%' . request ( 'keywords'   ) . '%');
    })
    ->where('year_id'  , '=', request ( 'year'   ) )
    ->where('school_id', '=', request ( 'school' ) )
    ->get();

但是,它仅返回StdActs。没有学生名。 如果可以在这里获取std_names;那么我认为我们可以解决原始问题。

1 个答案:

答案 0 :(得分:0)

您的原始查询受whereHas()的限制,符合条件的StdActs实例,但您不要求eager load关系。这是使用with()方法完成的,然后我们constrain that的要求与以前相同。

$stdActs = StdActs::whereHas('student', function($query) {
        $query->where('std_name', 'like' , '%' . request('keywords') . '%');
    })
    ->where('year_id', '=', request('year'))
    ->where('school_id', '=', request('school'))
    ->with(
        [
            'student' => function($query) {
                $query->where('std_name', 'like' , '%' . request('keywords') . '%');
            }
        ]
    )
    ->get();