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

Php Laravel:搜索与条件的关系并检索记录,php,laravel,eloquent,laravel-query-builder,Php,Laravel,Eloquent,Laravel Query Builder,我在学校数据库中有一些相关的表。我有学生、StdAct和交易记录。学生每年有一个帐户。因此,一个学生可能有很多账户(基于年份和年级)。例如:学生(id:2)可能有以下帐户 StdAct(学号:10,学号:2,学年:2018,年级:10) StdAct(学号:23,学号:2,学年:2019,年级:11) StdAct(学号:53,学号:2,学年:2020,年级:12)。。等等 StdAct可能有许多事务。例如,StdAct(id:10,年份:2018,等级:10)可能有以下交易: Tran(

我在学校数据库中有一些相关的表。我有学生、StdAct和交易记录。学生每年有一个帐户。因此,一个学生可能有很多账户(基于年份和年级)。例如:学生(id:2)可能有以下帐户

  • StdAct(学号:10,学号:2,学年:2018,年级:10)
  • StdAct(学号:23,学号:2,学年:2019,年级:11)
  • StdAct(学号:53,学号:2,学年:2020,年级:12)。。等等
StdAct可能有许多事务。例如,StdAct(id:10,年份:2018,等级:10)可能有以下交易:

  • Tran(id:110,act\u id:10,金额:20美元,创建时间:2020-10-10)
  • Tran(id:340,act\u id:10,金额:40美元,创建时间:2020-11-10)。。等等
我想打印一份这样的报告:

项目标准名称转换(金额)日期

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

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

我还可能需要根据给定的两个日期(用户输入)生成相同的报告。所以我会搜索两个给定日期之间的交易,并找到相关的StdActs和student(我们需要std_名称)

这是我的模型

类StdActs扩展模型
{
//
受保护的$table='StdActs';
公共职能学生()
{
返回$this->belongsTo('App\Students','student\u id');
//返回$this->belongsTo('App\Students','id');
}
公共职能事务()
{
返回$this->hasMany('App\Transactions','act\u id');
}
}
班级学生扩展模型
{
受保护的$table='Students';
公共功能StdActs()
{
返回$this->hasMany('App\StdActs','student_id','id');
}
}
类事务扩展模型
{
受保护的$table='事务';
公共功能StdAct()
{
返回$this->belongsTo('App\StdActs');
}
}
注: 我试过一些类似的案例(但不是我上面所问的案例),如下所示:

$stdActs=stdActs::whereHas('student',函数($query){
$query->where('std_name','like','%'。请求('keywords')。%');
})
->其中('year_id','=',请求('year'))
->其中('school_id','=',request('school'))
->get();
但是,它只返回StdActs。。没有学生的名字。。
如果可以在此处获取std_名称;然后我认为我们可以解决原始问题。

您的原始查询被
whereHas()
限制为满足要求的
StdActs
的实例,但您不要求处理关系。这是使用
with()
方法完成的,然后我们将使用与前面相同的需求

$stdActs=stdActs::whereHas('student',函数($query){
$query->where('std_name','like','%'。请求('keywords')。%');
})
->其中('year_id','=',request('year'))
->其中('school_id','=',request('school'))
->与(
[
'student'=>函数($query){
$query->where('std_name','like','%'。请求('keywords')。%');
}
]
)
->get();

您的原始查询受
whereHas()
限制,仅限于满足要求的
StdActs
实例,但您不要求建立关系。这是使用
with()
方法完成的,然后我们将使用与前面相同的需求

$stdActs=stdActs::whereHas('student',函数($query){
$query->where('std_name','like','%'。请求('keywords')。%');
})
->其中('year_id','=',request('year'))
->其中('school_id','=',request('school'))
->与(
[
'student'=>函数($query){
$query->where('std_name','like','%'。请求('keywords')。%');
}
]
)
->get();

非常感谢@miken32!。它很好用。我添加了一些代码来从“student”表中选择一些列。以下是我所拥有的:->with(['student'=>function($query){$query->where('std_name','like','%'。request('keywords')。%');}])->with('student:id,std_name')非常感谢@miken32!。它很好用。我添加了一些代码来从“student”表中选择一些列。以下是我所拥有的:->with(['student'=>function($query){$query->where('std_name','like','%'。request('keywords')。%');}])->with('student:id,std_name'))