Laravel: 搜索条件关系并检索记录
Laravel: searching relationships with conditions and retrieving the records
我在学校数据库中有一些相关表。我有 Student、StdAct 和 Transactions。学生每年都有一个帐户。所以一个学生可能有很多账户(基于年份和年级)。例如:学生(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, year:2018, grade:10th)可能有如下交易:
- Tran (id:110, act_id:10, 金额: 20$, Created_at: 2020-10-10)
- Tran (id:340, act_id:10, Amount: 40$, Created_at: 2020-11-10)..等等.
我想打印这样的报告:
项目Std_name交易(金额)日期
- 1 约翰 20 美元 2020-10-10
- 2 约翰 40 美元 2020-11-10
- 3 丹尼斯 44 美元 2020-11-02
等等..
给定(年份和年级),我想根据用户的给定输入(年份和年级)搜索并找到所有具有相关交易和相关学生姓名的 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();
我在学校数据库中有一些相关表。我有 Student、StdAct 和 Transactions。学生每年都有一个帐户。所以一个学生可能有很多账户(基于年份和年级)。例如:学生(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, year:2018, grade:10th)可能有如下交易:
- Tran (id:110, act_id:10, 金额: 20$, Created_at: 2020-10-10)
- Tran (id:340, act_id:10, Amount: 40$, Created_at: 2020-11-10)..等等.
我想打印这样的报告:
项目Std_name交易(金额)日期
- 1 约翰 20 美元 2020-10-10
- 2 约翰 40 美元 2020-11-10
- 3 丹尼斯 44 美元 2020-11-02
等等..
给定(年份和年级),我想根据用户的给定输入(年份和年级)搜索并找到所有具有相关交易和相关学生姓名的 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();