Php 调用未定义的方法Illumb\Database\Query\Builder::associate()
参考: 我收到错误:Php 调用未定义的方法Illumb\Database\Query\Builder::associate(),php,laravel-4,eloquent,Php,Laravel 4,Eloquent,参考: 我收到错误:调用未定义的方法illumb\Database\Query\Builder::associate() 以下是整个方法: public function saveUser($id) { $user = \User::find($id); $userdata = \Input::all(); $rules = array( 'email' => 'required|email', 'state' => 'si
调用未定义的方法illumb\Database\Query\Builder::associate()
以下是整个方法:
public function saveUser($id)
{
$user = \User::find($id);
$userdata = \Input::all();
$rules = array(
'email' => 'required|email',
'state' => 'size:2',
'zip' => 'size:5',
'phone' => array('regex:/^\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})$/')
);
$validator = \Validator::make($userdata, $rules);
if ($validator->passes())
{
if ($userdata['email'] !== $user->email)
{
$rules = array('email' => 'unique:users');
$validator = \Validator::make($userdata, $rules);
if ($validator->fails()) return Redirect::route('admin.user.edit', array('user' => $user))
->with('error', 'Specified email already exists.');
}
$user->email = $userdata['email'];
$user->firstname = $userdata['firstname'];
$user->lastname = $userdata['lastname'];
$userinfoArray = array(
'address' => $userdata['address'],
'city' => $userdata['city'],
'state' => $userdata['state'],
'zip' => $userdata['zip'],
'phone' => preg_replace('/[^0-9]/', '', $userdata['phone'])
);
$user->save();
if (!$user->userinfo)
{
$userinfo = new \Userinfo($userinfoArray);
$userinfo = $user->userinfo()->save($userinfo);
}
else
{
$userinfo = \Userinfo::find($id);
\User::find($id)->userinfo()->associate($userinfo)->save();
//$user->userinfo()->update($userinfoArray);
}
return \Redirect::route('admin.user.detail', array('id' => $id))
->with('success', 'User updated.');
}
return \Redirect::route('admin.user.edit', array('id' => $id))
->withInput()
->withErrors($validator);
}
associate()是belongsTo关系的一个方法,但从上面看,您似乎试图通过hasOne关系调用它
我只是猜测,因为您没有提供雄辩的模型类代码,因此无法看到您是如何准确设置关系的,但是如果您有:
class User extends Eloquent {
public function userinfo()
{
return $this->hasOne('Userinfo');
}
}
class Userinfo extends Eloquent {
public function user() {
return $this->belongsTo('User');
}
}
然后需要针对Userinfo调用associate,因为它具有associate()方法所附加的belongsTo关系
比如说
$user = \User::find(4);
$userinfo = \UserInfo::find(1);
$userinfo->user()->associate($user);
$userinfo->save();
将user\u info表中的外键user\u id设置为$user对象的id
看看上面的代码,看起来这并不是您真正想要做的,而是
$user->userinfo()->update($userinfoArray);
您已经注释掉的调用实际上将执行您似乎想要实现的操作,即更新与当前用户相关的userinfo(如果该用户已经存在)
希望这有帮助
Glen您需要指定如下相关字段:
public function profile()
{
return $this->hasOne('App\AdmProfile', 'id');
}
我在这个问题上纠缠了几天,结果很容易解决。我在“app”文件夹中创建了一个名为“models”的文件夹,但我忘记了重新配置auth.php文件 这是我的错误
Call to undefined method Illuminate\Database\Query\Builder
我通过在config文件夹中打开auth.php并将下面的行更改为包含我的models文件夹来修复它
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => Foodie\User::class,
修正:
希望这有帮助 将
hasOne
更改为belongsTo
。它看起来像:
class User extends Eloquent {
public function userinfo()
{
return $this->belongsTo('Userinfo');
}
}
class Userinfo extends Eloquent {
public function user() {
return $this->belongsTo('User');
}
}
非常感谢。使用update()很好,所以我将使用它。从引用的线程中,我得到的印象是associate()是正确的方法。错误消失了:$userinfo->user()->associate($user)$userinfo->save($userinfoArray);但是它没有保存$userinfoArray…如果您的数据库具有正确的名称约定,则实际上不必指定id。
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => Foodie\Models\User::class,
class User extends Eloquent {
public function userinfo()
{
return $this->belongsTo('Userinfo');
}
}
class Userinfo extends Eloquent {
public function user() {
return $this->belongsTo('User');
}
}