Laravel非静态方法问题

时间:2013-01-02 17:46:41

标签: php model laravel non-static

拥有以下型号:

news.php

class News extends Aware {

    public static $table = 'noticia';
    public static $key = 'idnoticia';
    public static $timestamps = false;

    public static $rules = array(
        'titulo' => 'required',
        'subtitulo' => 'required',
    );

    public function images()
    {
        return $this->has_many('Image');
    }
}

image.php

class Image extends Aware {

    public static $timestamps = true;

    public static $rules = array(
        'unique_name' => 'required',
        'original_name' => 'required',
        'location' => 'required',
        'news_id' => 'required',
    );

    public function news()
    {
        return $this->belongs_to('News');
    }

}

然后在控制器中执行以下操作:

$image = new Image(array(
    'unique_name' => $fileName,
    'original_name' => $file['file']['name'],
    'location' => $directory.$fileName,
    'news_id' => $news_id,
));
News::images()->insert($image);

我不断收到以下错误消息:

  

非静态方法News :: images()不应该静态调用,   从不兼容的上下文假设$ this

任何想法我做错了什么?

似乎不需要设置public static function images(),因为刷新后我收到错误

  不在对象上下文中

$ this

戈登说通过做News::images()->insert($image);我正在做一个静态的电话,但那是怎么看的呢

3 个答案:

答案 0 :(得分:3)

您在名为$this盟友的函数中使用static。那是不可能的。

只有在使用$this创建实例后,

new才可用。

如果打开严格模式,您将收到另一个错误,即images不是静态函数,因此不应静态调用。

问题出在News::images(),而不是images()->insert($image);

答案 1 :(得分:3)

你错过了一些步骤。

图片属于新闻,但您没有引用要更新的新闻帖子 你可能想这样做:

$image = new Image(array(...));
$news = News::find($news_id);
$news->images()->insert($image);

docs中的更多内容。

答案 2 :(得分:1)

$ this只能在对象实例中使用。 Class :: method()调用指定类的静态方法。

在你的情况下,你混合了两者。

图像的函数定义适用于对象实例:

public function images()
{
    return $this->has_many('Image');
}

您将其称为静态方法:

News::images()->insert($image);

需要实例化News类或修改images方法以支持静态调用。