首页 > 解决方案 > Laravel:搜索条件关系并检索记录

问题描述

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

一个 StdAct 可能有许多事务。例如,StdAct (id:10, year: 2018, Grade: 10th) 可能有以下交易:

我想打印这样的报告:

项目 Std_name Tran(Amount) 日期

等等..

给定(年份和年级),我想根据用户的给定输入(年份和年级)搜索并查找所有具有相关交易和相关学生姓名的 StdActs。

我还可能需要根据给定的两个日期(用户输入)生成相同的报告。所以我会搜索两个给定日期之间的交易并找到相关的 StdActs 和 Student(我们需要 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.. 没有 student_name.. 如果可以在这里获取 std_names;那么我认为我们可以解决原来的问题。

标签: phplaraveleloquentlaravel-query-builder

解决方案


您的原始查询仅限于满足要求whereHas()的实例StdActs,但您不会要求急切加载关系。这是使用该with()方法完成的,然后我们使用与以前相同的要求对其进行约束。

$key     = '%' . request('keywords') . '%';
$year    = request('year');
$school  = request('school');

$stdActs = StdActs::where('year_id', $year)
    ->where('school_id', $school)
    ->whereHas('student', fn ($q) => $q->where('std_name', 'like' , $key))
    ->with(['student' => fn ($q) => $q->where('std_name', 'like' , $key)])
    ->get();

推荐阅读