我不能使用一些Eloquent方法

时间:2015-06-09 13:16:56

标签: laravel-4 eloquent cartalyst-sentry

我试图将Eloquent用于关系,而alwys也有同样的结果:

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

我现在的问题。我试着用它来拯救一个儿子&#34; &#34;用户&#34;:

$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&#34; sons()&#34;的问题是什么?为什么在这个项目中Eloquent可以&#34;没有定义&#34;? (它的定义因为我可以使用Eloquent ORM进行搜索或保存)

谢谢你们

2 个答案:

答案 0 :(得分:1)

当我在等待答案时;),我仍然遇到Eloquent方法的问题。我不能使用$ user-&gt; books() - &gt; get()或 - &gt; attach()与许多用户和书籍的关系,以及User :: with(&#39; books&#39 ;)我有同样的问题

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 Stiil并与Eloquent合作。

答案 1 :(得分:0)

现在我认为你在查询生成器方面有点困惑。您不能使用$ user-&gt; books()因为书籍不是一种方法,而是仅使用书籍时,Eloquent使用魔术方法来获取表示字段或关系的模型属性

使用用户外观时,结果将是用户口才模型并使用此

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

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

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

这可能是某个Eloquent Model的ArrayCollection。 请参阅get()方法特定于Query Builder,仅在尝试从Db获取数据时使用。

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

未来这里有一些提示

  • User Facade只是不需要实例化一个新对象来构建特定Model的查询,但最后这仍然是一个QueryBuider,所以它只有像“with”或“get”这样的查询的特定方法或“加入”等
  • 不要尝试将查询构建器方法用于Eloquent Model。没有理由

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

    $user->books->save()
    
祝你好运