问题描述
我在学校数据库中有一些相关表格。我有学生,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;那么我认为我们可以解决原始问题。
解决方法
您的原始查询受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','%' . request('keywords') . '%');
}
]
)
->get();