因为工作原因再次使用laravel,自然也是要写模型关联的代码,比如有自带的用户表users和用户信息表usersinfo

id,userid,address

模型名

UsersInfo.php

很简单的一对一关联

user模型内的定义

public function HasUsersInfo(){

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

}

随便插了几条数据(这里不展示其它数据,因为没意义)

用户表

用户信息表

然后假设我想查询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,我也不想去研究英文的复数规则,直接模型里指定表名就是了

03-10 02:14