【问题标题】:I can't use some Eloquent methods我不能使用一些 Eloquent 方法
【发布时间】:2015-08-24 08:02:25
【问题描述】:

我正在尝试将 Eloquent 用于关系,但结果总是相同:

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

如果我使用其他代码,xxxx 可以是我的模型中定义的“儿子”或 save()。

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

<?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 是一个未定义的类。即便如此,我也可以使用一些方法。

我现在的问题。我尝试使用它来保存“用户”的“儿子”:

$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 可以“未定义”? (它的定义是因为我可以使用 Eloquent ORM 搜索或保存)

谢谢大家

【问题讨论】:

    标签: laravel-4 eloquent cartalyst-sentry


    【解决方案1】:

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

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

    我的问题是因为 Sentry。我得到了用户:

    $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。

    【讨论】:

      【解决方案2】:

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

      当使用 User 门面时,结果将是一个 User Eloquent Model 并且通过使用这个

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

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

      $mybooks = $user->books
      

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

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

      这里有一些提示

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

        $user->with(books) if you already fetched books using. With method does not even exists
        User::with(books)->get() 
        
      • 从模型中保存你的模型

        $user->books->save()
        

      祝你好运

      【讨论】:

      • 对不起,但是 books() 它是在用户模型中创建的一个 Eloquent 方法来定义关系。正如您在问题附加的代码中使用方法 users() 和 sons() 看到的那样。这些方法在 Laravel 文档中。您正在谈论 Eloquent Eager Loading。如果未定义方法 books()、sons() 或 users(),则它不起作用。
      • ->save() 用于保存模型,我在数据透视表中保存两个模型之间的关系,必须使用 ->attach() 或 ->detach(),添加save() 如果它没有被保存。
      • 是的@kikerrobles,但你不需要调用$user->books(),因为在使用Facade User::with('books') 并在关系属性中加载你的书时会调用它用户雄辩模型对象。然后,当尝试使用 $user->books 访问它时,它会调用一个魔术方法并获取关系书。事实上,我在谈论 Eloquent Eager Loading 并且这些方法在加载关系时使用,它们并不意味着从你的 Eloquent 模型对象中调用,例如 $user->books(),因为它不会返回或做任何事情: )
      • 嗨坤,我现在正在使用这种方法,并且它们有效。如果我有一个很大的基础,我使用“with”,它会减少查询。但是请阅读任何文档,这些方法在每个具有关系的模型中都定义了,并且它们有效,¡当然! ;)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-04
      • 1970-01-01
      • 1970-01-01
      • 2022-06-30
      • 2016-02-03
      相关资源
      最近更新 更多