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

Laravel: searching relationships with conditions and retrieving the records

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

一个 StdAct 可能有很多交易。比如StdAct(id:10, year:2018, grade:10th)可能有如下交易:

我想打印这样的报告:

项目Std_name交易(金额)日期

等等..

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

我可能还需要根据给定的两个日期(用户输入)生成相同的报告。所以我会搜索两个给定日期之间的交易并找到相关的 StdActs 和学生(我们需要 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();

然而,它只有returns StdActs..没有student_name.. 如果有可能在这里得到std_names;那么我想我们可以解决原来的问题。

您的原始查询 whereHas() 仅限于满足要求的 StdActs 实例,但您没有要求 eager load the relationship. This is done using the with() method, and then we constrain that 与以前相同的要求。

$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();