laravel中的where子句可以获得多对多

时间:2018-04-14 06:59:24

标签: php laravel

我有以下3个表:

  • 工具
  • 零件
  • Part_details

这是我的表结构:

Tool -> has many -> parts. part -> has many->part_details.

Tool : id*, name; Parts : id*, name, tool_id; part_details: id, part_id, total;

问题: 使用laravel模型,我如何获得具有 biggest total on parts_details 的一部分工具?

3 个答案:

答案 0 :(得分:0)

//工具模型

public function parts(){
   return $this->hasMany(Part::class);
}

//零件模型

public function part(){
   return $this->belongsTo(Tool::class);
}
public function part_details(){
  return $this->hasMany(PartDetail::class);
}

// PartDetail Model

public function part(){
   return $this->belongsTo(Part::class);
}

现在查询工具模型

$tools = Tool::with('parts')->withCount('parts.part_details')->get();
$toolWithMaxCount = $tools->filter(function($tool) use ($tools){
   return $tool->parts->max('par_details_count') === $tools->max('parts.part_details_count');
})->first();

您可以通过添加一些原始绑定来优化它来改善这一点。我想你明白了。

答案 1 :(得分:0)

使用 hasManyThrough 关系获取与工具相关的所有部件详细信息,然后您可以检查逐个记录并获得工具部件的最高总数。

//工具模型

public function partsdetails()
{
    return $this->hasManyThrough('App\PartDetail', 'App\Part','tool_id','part_id');
}

在您的控制器中

$data = Tool::all(); 
        $array = [];
        if(isset($data) && !empty($data)) {

            foreach ($data as $key => $value) {
               $array[$value->id] = Tool::find($value->id)->partsdetails()->sum('total');
            }
        }

        if(is_array($array) && !empty($array)) {
            $maxs = array_keys($array, max($array));
            print_r($maxs);
        } 
        else{
         echo "No Data Available";
        }

答案 2 :(得分:0)

工具模型

public function parts() {
   return $this->hasMany('App\Part');
}

零件模型

public function details() {
   return $this->hasMany('App\PartDetail');
}

public function tool() {
   return $this->belongsToMany('App\Tool');
}

详细模型

public function part() {
   return $this->belongsToMany('App\Part');
}

控制器

$tools = Tool::with('parts', 'parts.details')
             ->find($id)
             ->max('parts.part_details');