2015-06-14 88 views
0

我試圖在Laravel 5中生成一個唯一/隨機字符串,並通過我的表檢查它是否存在。FatalErrorException:調用非對象的成員函數count()

這是我有什麼,但似乎是給在標題中所述的錯誤:

public static function generate() 
    { 
     $exists = true; 
     while ($exists) { 
      $code = str_random(15); 
      $check = self::where('code', $code)->first(); 
      if(! $check->count()){ 
       $exists = false; 
      } 
     } 
     return $code; 
    } 

任何人都知道爲什麼,它給這個錯誤?

+1

錯誤是說這不是爲計數方法返回一個對象被叫做。如果你運行'self :: where('code',$ code) - > first()',你很可能看到沒有任何東西。試試'if(!$ check)'而不是調用count方法。 – haakym

+0

謝謝,這固定了錯誤。 – Pex

+0

太好了,我會拋出一個答案,如果你不介意:) – haakym

回答

2

你看到的是告訴你,你要調用一個值不是一個對象的方法的錯誤。在您的代碼中,最有可能的是您返回null,因爲您的查詢中沒有返回任何結果。您可以隨時看到你在Laravel查詢返回什麼用dd()

dd(Self::where('code', $code)->first())

所以之前調用count()或值的任何其他方法,你正在等一個對象,你應該檢查它不是空。

做這個,你可以在你所提供的代碼更新您的if語句:

public static function generate() 
{ 
    $exists = true; 

    while ($exists) 
    { 
     $code = str_random(15); 

     // It's good practice to capitalise objects: Self instead of self 
     $check = Self::where('code', $code)->first(); 

     if(!$check) 
     { 
      $exists = false; 
     } 
    } 

    return $code; 
} 

正如Halayem阿尼斯提到你還可以測試,如果你正在檢查的值是使用is_object()函數的對象,但我認爲你可能需要使用&&運營商,而不是||

if(!$check && !is_object($check)) 
+0

1K更接近... :)繼續去 –

+0

哈哈非常感謝我的朋友希望很快加入1k俱樂部:) - btw我完全如果你需要使用'&&'或'||',不確定你是否可以澄清 – haakym

2

處理之前,一定要檢查您的返回值...

public static function generate() 
     { 
      $exists = true; 
      while ($exists) { 
       $code = str_random(15); 
       $check = self::where('code', $code)->first(); 
       if(is_null ($check) || 
        ! is_object($check) || 
        ! $check->count()) 
       { 
        $exists = false; 
       } 
      } 
      return $code; 
     } 
相關問題