我无法使用某些 Eloquent 方法

I can't use some Eloquent methods

我正在尝试将 Eloquent 用于关系并且总是得到相同的结果:

Call to undefined method Illuminate\Database\Query\Builder::xxxx()

其中 xxxx 可以 "sons" 在我的模型中定义,或者如果我使用其他代码则保存 ()。

首先我有这两个模型(简化):

<?php

use Cartalyst\Sentry\Users\Eloquent\User as SentryUserModel;

class User extends SentryUserModel {

    public static $rules =          array(  'first_name'        => 'required',
                                            'last_name'         => 'required',

    );

    protected $hidden = array('password', 'remember_token');

    public function sons()
    {
        return $this->hasMany('Son');
    }

}

class Son extends \Eloquent {

    protected $guarded =['id'];

    public $timestamps = false;

    public static $rules =          array(  'first_name_son'    => 'required',

    );

    public function user()
    {
        return $this->belongsTo('User');
    }

}

PhpStrorm 告诉我 Eloquent 是未定义的 class。尽管如此,我还是可以使用一些方法。

我现在的问题。我试着用它来保存 "son" of a "user":

$user = Sentry::getUser();
$data = Input::all();
$rules_son = Son::$rules;

$son = new Son(array(
            'first_name_son'    => $data['first_name_son'],
 ));

 $user->sons()->save($son);

这里用

换行
Call to undefined method Illuminate\Database\Query\Builder::sons()

如果我使用

$user->with('sons')->save($son);

Call to undefined method Illuminate\Database\Query\Builder::save()

这很好用

Son::create(array(
            'user_id'           => $user->id,
            'first_name_son'    => $data['first_name_son'],
));

所有这些代码都在我的 UsersController 中

使用 mnethod "sons()" 有什么问题,为什么在这个项目中 Eloquent 可以是 "not defined"? (它的定义是因为我可以使用 Eloquent ORM 进行搜索或保存)

谢谢大家

当我在等待答案时 ;),我仍然遇到 Eloquent 方法的问题。我不能在多对多用户和书籍的关系中使用 $user->books()->get() 或 ->attach() 之类的东西,还有 User::with('books') 我有同样的问题

Call to undefined method Illuminate\Database\Query\Builder::xxxx()

我的问题是因为哨兵。我得到用户:

$user = Sentry::getUser();

而且,我不知道为什么,这个 $user 也不是 User 模型,所以有些方法会失败。

我的解决方案,不知道是不是最好的: - 创建一个静态函数来调用仍在使用 Sentry

的用户
//In User.php model
public  static function eloquentUser(){
    $sentry_user = Sentry::getUser();
    return $user = User::findOrFail($sentry_user->id);
}

然后我调用它:

$user = User::eloquentUser();

仍然使用 Sentry 并使用 Eloquent。

现在我认为您对查询生成器有点困惑。您不能使用 $user->books() 因为 books 它不是一种方法,相反,当仅使用 books 时,Eloquent 使用魔术方法来获取模型属性,这意味着 table 字段或关系

当使用 User facade 时,结果将是一个 User Eloquent 模型并使用这个

$users = User::with("books")->get()

它将获取所有用户和每个用户的书籍。您现在可以通过制作

来访问您的图书
$mybooks = $user->books

这可能又是某个 Eloquent 模型的 ArrayCollection。 请参阅 get() 方法特定于查询生成器,并且仅在尝试从 Db 获取数据时使用。

现在,我没有得到哨兵的部分。

这里有一些关于未来的提示

  • User Facade 只是不需要实例化一个新对象来为特定模型构建查询,但最终这仍然是一个 QueryBuider,因此它只有查询的特定方法,例如 "with" 或"get" 或 "join" 等
  • 不要尝试对 Eloquent 模型使用查询生成器方法。没有理由做

    $user->with(books) if you already fetched books using. With method does not even exists
    User::with(books)->get() 
    
  • 从类似

    的模型中保存您的模型
    $user->books->save()
    

祝你好运