V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
domino
V2EX  ›  PHP

Laravel ORM 如何查询关联表

  •  
  •   domino · 2016-12-07 19:34:03 +08:00 · 10097 次点击
    这是一个创建于 2909 天前的主题,其中的信息可能已经有所发展或是发生改变。
    刚学 Laravel 对 ORM 操作有点不熟悉,
    想请教一下,
    我有两个表,分别为 posts,users
    并在 posts model 做了关联.

    public function author(){
    return $this->belongsTo('App\User','user_id','id');
    }
    想要写一个搜索功能,透过搜索作者,找到所有发文,
    ORM 方式该怎做呢? 下面方式似乎找不到
    $posts = Post::query();
    $posts->orWhere('name', '=', "{$keyword}");

    还是只能用查询构造器方式来写呢?
    $posts = Post::leftjoin('users', 'posts.user_id', '=', 'users.id');
    这样虽然是能运行,也能加入 where 条件做搜索.
    但感觉似乎是用 Query Builder 完成的,并非使用关联
    这样关联似乎是否就没意义了.
    7 条回复    2017-09-18 15:44:35 +08:00
    xuxu
        1
    xuxu  
       2016-12-07 19:43:09 +08:00
    user 的 model 加上 hasMany 关系
    jay4497
        2
    jay4497  
       2016-12-07 19:52:32 +08:00
    加上楼上的,然后获取 $user ,然后用户下的所有文章就是 $posts = $user->posts;
    maja
        3
    maja  
       2016-12-07 20:07:35 +08:00
    domino
        4
    domino  
    OP
       2016-12-07 20:10:51 +08:00
    那如果要可以搜索 users 的 name 或 posts 的 title 呢 ?
    用 leftjoin 可以直接在下面加两 Where 来解决.
    domino
        5
    domino  
    OP
       2016-12-07 20:14:55 +08:00
    我在练习写一个文章列表,
    搜索列表可以用 作者名称 或 标题.
    目前只会用 Query Builder 来写.

    relationships 方式还是不清楚.
    dntc
        6
    dntc  
       2016-12-07 20:52:45 +08:00
    @domino
    $user = User::with(['posts' => function($query) {
    $query->where('title', 'like', '%标题%');
    }])->where('name', '=', '姓名')->first();
    pov32
        7
    pov32  
       2017-09-18 15:44:35 +08:00
    post:with('users')->wherehas('users', function($query){
    $query->where('name', 'like', '%作者名称%');
    })->get();
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4015 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 05:14 · PVG 13:14 · LAX 21:14 · JFK 00:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.