首页 > 解决方案 > Laravel 8 - 一对多关系总数不起作用

问题描述

我有一个具有一对多关系的卡车和包裹表。

一辆卡车有很多包裹,一个包裹属于一辆卡车。

我有一no_of_items列显示属于特定卡车的包裹总数。这就是我在卡车控制器中定义它的方式:

public function store(Request $request)
    {
        $request->validate([
            'truck_number'=>'required|unique:trucks',
            'no_of_items',
            'postman_name'=>'required',
            'date_of_operation'=>'required',
            'status'=>'required'
        ]);
        $trucks = new Truck([
            'truck_number' => $request->get('truck_number'),
            'no_of_items' => $request->get('no_of_items'),
            'postman_name' => $request->get('postman_name'),
            'date_of_operation' => $request->get('date_of_operation'),
            'status' => $request->get('status')
        ]);
        $trucks->save();
        return redirect(TRUCK)->with('success', 'Truck Details Saved!');
    }

但它不会在truck/index.blade.php或其他任何地方显示任何内容。这是为什么?

我的模型:

class Truck extends Model
{
    use HasFactory;
    protected $primaryKey = 'truck_id';
    protected $fillable = ['truck_number', 'no_of_items', 'postman_name', 'date_of_operation', 'status'];
    
     public function Package()
    {
        return $this->hasMany(Package::class, 'truck_number');
    }
}

class Package extends Model
{
    use HasFactory;
    protected $primaryKey = 'package_id';

    protected $fillable = ['truck_number', 'package_number', 'destination', 'date_of_operation'];
    
     public function Truck(){
        return $this->belongsTo(Truck::class);
    }

}

truck/index.blade.php文件:

<table class="table table-striped mt-5">
    <thead>
        <tr>
          <th>No</th>
          <th>Truck Number</th>
          <th>Quantity</th>
          <th>Postman in Charge</th>
          <th>Operation Date</th>
          <th>Status</th>
          <th colspan="2" class="text-center">Actions</th>
        </tr>
    </thead>
    <tbody>
    @foreach($trucks as $count => $truck)
        <tr>
            <td>{{++$count}}</td>
            <td><a href="{{ route('truck.show',$truck->truck_id)}}">{{$truck->truck_number}}</a></td>
            <td>{{$truck->Package()->count()}}</td>
            <td>{{$truck->postman_name}}</td>
            <td>{{$truck->date_of_operation}}</td>
            <td>{{$truck->status}}</td>
            <td class="text-center">
                <a href="{{ route('truck.edit',$truck->truck_id)}}" class="btn btn-primary btn-block">Edit</a>
            </td>
            <td class="text-center">
                <form action="{{ route('truck.destroy', $truck->truck_id)}}" method="post">
                  @csrf
                  @method('DELETE')
                  <button class="btn btn-danger btn-block" type="submit">Delete</button>
                </form>
            </td>
        </tr>
        @endforeach
    </tbody>
  </table>
  <div class="text-center">
    <a style="margin: 19px;" href="{{ route('truck.create')}}" class="btn btn-primary bg-success">New Truck Details</a>
  </div>

标签: phplaraveleloquent

解决方案


以这种方式修改您的关系,因为默认情况下,laravel 将引用与您的关系外键不匹配的模型的主 ID

public function Package()
{
 return $this->hasMany(Package::class, 'truck_number','truck_number');
}

推荐阅读