【问题标题】:Laravel: searching relationships with conditions and retrieving the recordsLaravel:搜索条件关系并检索记录
【发布时间】:2021-02-17 10:04:21
【问题描述】:

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

  • StdAct(id:10,student_id:2,年份:2018,年级:10)
  • StdAct(id:23,student_id:2,年份:2019,年级:11)
  • StdAct (id:53, student_id:2, year: 2020, Grade: 12th).. 以此类推。

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

  • Tran (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)..等等。

我想打印这样的报告:

Item Std_name Tran(Amount) Date

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

等等..

鉴于(年份和年级),我想根据用户的给定输入(年份和年级)搜索并查找所有具有相关交易和相关学生姓名的 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;那么我认为我们可以解决原来的问题。

【问题讨论】:

    标签: php laravel eloquent laravel-query-builder


    【解决方案1】:

    您的原始查询被whereHas() 限制为满足要求的StdActs 实例,但您不要求eager load 关系。这是使用with()方法完成的,然后我们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();
    

    【讨论】:

    • 非常感谢@miken32!。它工作正常。我添加了一些代码来从“学生”表中选择一些列。这是我所拥有的: ->with( [ 'student' => function($query) { $query ->where('std_name', 'like' , '%' . request('keywords') . '%' ) ; } ] )->with('student:id,std_name')
    猜你喜欢
    • 2021-07-25
    • 2018-08-31
    • 1970-01-01
    • 2015-08-13
    • 1970-01-01
    • 2021-04-10
    • 2020-05-04
    • 2015-10-30
    • 2015-06-11
    相关资源
    最近更新 更多