Laravel 5 - 调用未定义的方法

时间:2016-02-23 22:00:29

标签: php laravel model laravel-5.2

我试图在我的视图中调用模型中的方法,但是我遇到了这个错误:

  

调用未定义的方法Illuminate \ Database \ Query \ Builder :: hasLogo()   (查看:/Users/Documents/audit/resources/views/misc/logo.blade.php)

型号:(网站)

  public function hasLogo()
  {
    return File::exists(public_path($this->logo->url()));
  }

控制器:(HomeController.php)

  public function showLogo()
  {
    $sites = Site::where('user_id', Auth::id());
    return View::make('misc.logo')->with(['sites' => $sites]);
  }

查看:logo.blade.php

@if ($sites->hasLogo())

<img src="<?= $sites->logo->url('medium') ?>" alt="<?= $sites->name ?>" 
          class="img-rounded col-md-12" style="padding-bottom: 20px;">

@endif

我不确定为什么它无法在Site模型中找到此方法。非常感谢你的帮助。

3 个答案:

答案 0 :(得分:4)

您没有检索任何内容。这就是你现在所拥有的:

$sites = Site::where('user_id', Auth::id());

这仅仅是准备查询。在调用first()get()等方法之前,您尚未提取任何内容。因此,请尝试以下方法:

$sites = Site::where('user_id', Auth::id())->firstOrFail();

firstOrFail()也只会获取一个网站。如果您要获取符合要求的所有网站,则需要使用get()然后循环浏览网站。

$sites = Site::where('user_id', Auth::id())->get();
foreach ($sites as $site)
{
    if ($site->hasLogo())
    {
        // etc.
    }
}

答案 1 :(得分:0)

在此完成您的查询:

$sites = Site::where('user_id', Auth::id())->get();

根据您的需要致电get()first()

现在您可以调用自定义方法了。

答案 2 :(得分:0)

$sites = Site::where('user_id', Auth::id());

应该是

$sites = Site::where('user_id', Auth::id())->get(); // ->get() the data

foreach($sites as $site) {
    if( $site->hasLogo() ) {
        // do stuff
    }
}

如果您不调用get(),它仍将是查询构建器对象。如果您在hasLogo()上致电logo()$sites,则会失败,因为这是eloquent collection,而非模型。