laravel5.4模型关联查询的坑

由于工做缘由再次使用laravel,天然也是要写模型关联的代码,好比有自带的用户表users和用户信息表usersinfophp

id,userid,addresshtml

模型名laravel

UsersInfo.php闭包

很简单的一对一关联this

user模型内的定义spa

public function HasUsersInfo(){

return $this->hasOne('App\UsersInfo','userid');

}

随便插了几条数据(这里不展现其它数据,由于没意义)code

用户表htm

id name
1 gcud
2 gcud2
3 gcud3

用户信息表ci

id address userid
1 地址1 1
2 地址2 2
3 地址3 3

而后假设我想查询id>1的用户名和地址文档

$Users=User::where('id','>',1)->with('HasUserInfo')
        ->get();
        dd($Users);

结果

array:2 [▼
  0 => array:6 [▼
    "id" => 2
    "name" => "gcud2"
    "email" => "gcud2@163.com"
    "created_at" => null
    "updated_at" => null
    "has_user_info" => array:3 [▼
      "id" => 2
      "address" => "地址2"
      "userid" => 2
    ]
  ]
  1 => array:6 [▼
    "id" => 3
    "name" => "gcud3"
    "email" => "gcud3@163.com"
    "created_at" => null
    "updated_at" => null
    "has_user_info" => array:3 [▼
      "id" => 3
      "address" => "地址3"
      "userid" => 3
    ]
  ]
]

虽然能获得结果,但列出全部字段的结果并非我想要的,因而如同往常的,我在get里限定了列

$Users=User::where('id','>',1)->with('HasUserInfo')
        ->get(['name']);
        dd($Users->toArray());

结果

array:2 [▼
  0 => array:2 [▼
    "name" => "gcud2"
    "has_user_info" => null
  ]
  1 => array:2 [▼
    "name" => "gcud3"
    "has_user_info" => null
  ]
]

确实是只剩下名字,但地址也跟着空了,经谷歌搜索和5.4文档上写的,好像是要在with关联里面写闭包,指定字段,大概是这个样子

$Users=User::where('id','>',1)
            ->with(['HasUserInfo'=>function($query){
                $query->select('address');
        }])
        ->get(['name']);
        dd($Users->toArray());

然而结果仍然为空,不知是我眼拙仍是什么,我反正是没在5.4文档找到模型关联查询指定字段的方法,谷歌搜来搜去都是在说要用闭包select来指定字段,就是像上面写的那样

当时用谷歌搜索时前几个老是思否的几个问题,在别人的问题的几轮回复提问下我仍是找到了答案,那就是闭包内和原模型都要传入关联字段

$Users=User::where('id','>',1)
            ->with(['HasUserInfo'=>function($query){
                $query->select('userid','address');
        }])
        ->get(['id','name']);
        dd($Users->toArray());

结果

array:2 [▼
  0 => array:3 [▼
    "id" => 2
    "name" => "gcud2"
    "has_user_info" => array:2 [▼
      "userid" => 2
      "address" => "地址2"
    ]
  ]
  1 => array:3 [▼
    "id" => 3
    "name" => "gcud3"
    "has_user_info" => array:2 [▼
      "userid" => 3
      "address" => "地址3"
    ]
  ]
]

真坑,卡了我很一下子,写这篇文章时我又去搜了谷歌,发现第一条就是就是须要的,虽然没有明确指明要带关联,看看还能能很快知道的

哦,另外还有一个小坑的地方就是模型名称,从直觉来看,默认状况下模型名是表名加个s,但若是不仔细看文档可能会出问题,文档里面说了

除非数据代表确地指定了其它名称,不然将使用类的「蛇形名称」、复数形式名称来做为数据表的名称。

通常状况下直接加s是没问题的,但别忘了说的是复数形式,在英文中某些特殊字母结尾的单词并非直接加s,好比study的复数形式是studies,也就是说模型名为Study.php,默认表名得是studies,我也不想去研究英文的复数规则,直接模型里指定表名就是了

相关文章
相关标签/搜索