laravel 一对多关系详解hasMany
xuexi 2023-08-02 13:34:38 发表在:PHP 查看数:977

表bdgx是一 id 表gxxq是多 bdgx_id 在模型中:


class Bdgx extends Model { 
     //use SoftDeletes;                        //是软删除用的 就是数据再。日期字段多了一个日期
    protected $table = 'bdgx'; 

    protected function serializeDate(DateTimeInterface $date)
    {
        return $date->format('Y-m-d H:i:s');
    }

    public function gxxqs()
    {
        return $this->hasMany(Gxxq::class);
    }

}

控制器:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Bdgx;

class YemianController extends Controller
{
    public function index(Bdgx $bdgx, Request $request)
    {
        // Bdgx 是模型名,本身没有数据,路由里的{bdgx:id}从url yemian/4,里获取了4,也就是{bdgx:4},bdgx对应的是index(Bdgx $bdgx, Request $request)里的$bdgx,这样就获取到了/yemian/4的补丁更新表里id=4的数据,赋予给$bdgx,$bdgx就有了数据,控制里本身可以用,也可以传给模板了。
        // 如果url里的id是数据表里不存在的,就会自动转到404页面,对于非异步(如ajax)的页面比较常用,对于异步/弹窗的不太友好,因为你没有其他提示数据不存在的提示框,就展示404吧。
        $result = $bdgx->gxxqs()->paginate(10); // ->get()也可以换成paginate(10),数据100行以内的话,分页没啥必要
        // $bdgx 就是 补丁更新(父)的model数据
        return view('yemian',compact('bdgx', 'result'));
    }
}

视图:

{{$bdgx->bbh}}

路由:

Route::get('/yemian/{bdgx:id}', [App\Http\Controllers\YemianController::class, 'index'])->name('yemian');

核心知识点: 模型关系的这个要写在主键id的这个表里面才行

1对1

前面的1是父表,后面的1是子表 父表 加 子表 关联字段,字段名是 子表名_id

1对多 前面的 1 是父表,后面的 多 是子表 子表 加 父表 关联字段,字段名是 父表名_id

多对多,不分父子。

两个表都不需要加关联字段。 关联字段放 新建的 中间表里。

上述路由中{bdgx:id} 是 {bdgx:4} 不是表示 bdgx 就是 4 4对应的是id

实例化不一定是 new Article 这种 比如模型里,直接可以用本模型 $this 代表 $model 控制器里,如果是路由模型绑定的方法里有了 Article $article 可以直接使用 $article 代表这个$model

最近访问时间:2025-04-29 12:16:24
知识库:340条鸣谢:TAY  备案号:蜀ICP备2024090044号