2017-10-16 34 views
1

您好我無法在控制器中添加新的函數後從數據庫獲取數據。任何人都可以向我解釋這個錯誤,我該怎麼辦?試圖從數據庫中獲取數據時未定義的變量laravel

背景信息:我有3種不同類型的表,personal_infos,user_infos和user_info1s表,其中personal_infos hasMany user_infos和user_info1s。我使用的user_id爲外鍵與personal_infos表

我使用this video作爲參考,要像做他的最終結果聯繫在一起(見視頻的17.17),但我得到這個錯誤:

Error: Undefined variable: data 

我想要做什麼:enter image description here Route.php

Route::get('/home/{id}', '[email protected]')->name('home'); 

的HomeController

public function getData($id) { 
    $data['data'] = DB::table('personal_infos')->get()->sortByDesc('upload_time'); 

    if (count($data) > 0) { 
     return view('home',$data) 
      ->with('test', personal_info::find($id)); // --> after adding this got error 
    } else { 
     return view('home'); 
    } 
} 

Home.blade.php

<table class="table table-bordered"> 
    <tr> 
    <th><strong><big>Name: </big></strong></th> 
    </tr> 
    <td> 
    <tr> 
    @foreach($data as $value) 
    <tr>  
    <th>{{HTML::link_to_route('home',$value->Name, array($value->id)) }}</th>    
    </tr> 
    @endforeach 
    </tr> 
    </tr> 
</table> 

代碼,我現在有一些變化後:

的HomeController:

public function getData($id = null){ 

     $data['data'] = DB::table('personal_infos')->orderBy('created_at', 'desc')->get(); 
     return view('home') 
    ->with('personalInfos', $personalInfos) 
    ->with('test', personal_info::find($id)); 

}}

home.blade.php

<ul> 
    @foreach ($personalInfos as $info) 
     <li>{{ HTML::link_to_route('home', $info->Name, [ $info->id ]) }}</li> 
    @endforeach 
</ul> 

路線

Route::get('/home/{id?}', '[email protected]')->name('home'); 

的personal_info模型:(不知道是不是必要的,但以防萬一)

class personal_info extends Eloquent 
{ 
    protected $fillable = array('Email', 'Name', 'Mobile_No'); 
    protected $table = 'personal_infos'; 
    protected $primaryKey = 'id'; 
    public function user_infos() { 
     return $this->hasMany('App\user_info','user_id'); 
    } 
     public function user_info1s() { 
     return $this->hasMany('App\user_info1','user_id'); 
    } 
} 

user_info1而且USER_INFO(它們是相似的,所以我只是把他們1中)

class user_info1 extends Eloquent 
{ 
      protected $fillable = array('hobby','sport','user_id'); 
    public function personal_infos() { 
     return $this->belongsTo('App\personal_info', 'user_id', 'id'); 
    } 
} 
+0

它在控制器中嗎? – shashi

+0

錯誤來自home.blade.php,但我認爲原因是來自控制器,我看到一些人使用compact的這種情況,但對我來說它似乎並不像它的工作 – blastme

+0

雖然與錯誤無關,一些表格行和單元格的嵌套關閉。 '​​'(單元格)應該嵌套在''(行)內,''(表格標題單元格)應嵌套在''元素內的''內。 –

回答

1

我可以告訴你正在學習Laravel。發佈在您的問題中的代碼有幾個問題。讓我們通過其中每一個來看看我們是否可以提高你的理解。

首先,讓我們來看一看在控制器方法簽名:

public function getData($id) 

這種方法預計在相應的路徑所定義的$id參數。但是,如果我們看一看路線:

Route::get('/home/(:any)', '[email protected]')->name('home'); 

...它沒有正確地聲明該URL包含一個參數(你正在觀看的視頻是關於一個很老的版本Laravel的)。如the docs描述的那樣,我們需要改變路線簽名包括參數$id

Route::get('/home/{id}', '[email protected]')->name('home'); 

接下來,讓我們來看看控制器的方法如何獲取其數據:

$data['data'] = DB::table('personal_infos')->get()->sortByDesc('upload_time'); 

此查詢取所有記錄從personal_infosCollection,然後按upload_time對它們進行排序。這是好的,但數據庫引擎可以將數據比我們的PHP應用程序更快通常排序,所以我們可以指示DB我們的數據爲我們進行排序:我們

$data['data'] = DB::table('personal_infos')->orderBy('upload_time', 'desc')->get(); 

注意如何改變呼叫sortByDesc()對收集到orderBy()爲數據庫查詢。現在,數據庫爲我們分類結果,因此收集不需要。

最後,我們試着修復將數據傳遞給視圖時遇到的錯誤。這是你的控制器的方法目前是怎麼做的:

if (count($data) > 0) { 
    return view('home', $data) 
     ->with('test', personal_info::find($id)); // --> after adding this got error 
} else { 
    return view('home'); 
} 

有與上面的代碼幾個問題:

  1. count($data)總是大於零,因爲我們設定每次$data['data']我們稱之爲方法,所以else塊將會執行從不執行。這可能是很好的,因爲...
  2. ...當count($data)等於零,控制器不通過視圖任何數據,因此$data視圖將undefined

在考慮中的視圖使用@foreach循環通過每個結果的,所以我們可以簡化在控制器方法的代碼,因爲foreach不會迭代空集合:

$personalInfos = DB::table('personal_infos')->orderBy('upload_time', 'desc')->get(); 

return view('home') 
    ->with('personalInfos', $personalInfos) 
    ->with('test', personal_info::find($id)); 

視圖將從上述方法中收到兩個變量:$personalInfos$test。我冒昧地將$data['data']重命名爲更有意義的變量。隨着項目的發展,這變得非常重要。以下是我們如何使用視圖中的數據:

<ul> 
    @foreach ($personalInfos as $info) 
     <li>{{ HTML::link_to_route('home', $info->Name, [ $info->id ]) }}</li> 
    @endforeach 
</ul> 

上面的模板輸出一個無序列表,如問題中的圖像所示。原始表格包含多行/列嵌套錯誤,並且不會顯示問題所描述的信息。正如我們所看到的,這個模板遍歷了$personalInfos中的每個結果。如果$personalInfos爲空,則列表將不顯示任何項目。

如果我們想要我們的控制器方法來處理的路由,有或沒有的ID,我們需要告訴Laravel該ID是可選的。對於路線,參數後一個問號(?)使得可選:

Route::get('/home/{id?}', '[email protected]')->name('home'); 

然後,我們可以爲處理該路由控制器方法的默認值。在這種情況下,我們會使用null

public function getData($id = null) 

當然,當我們更新此,我們需要改變的方法來處理null$id說法,我們用它來獲取該視圖的一個personal_info$test變量。這個問題並不能解釋如何使用$test,所以我會把這個作爲練習留給讀者:)

+0

謝謝你的明確解釋,並告訴我什麼是正確和錯誤的做法。但在更改以下內容後,我收到了home.blade.php中的錯誤「Undefined variable:personalInfos」。我猜它與我的問題中顯示的原始錯誤「undefined variable:data」類似。我去了解更多的信息,並看到一些使用compact的人將數據傳遞給blade.php。可以使用它嗎?如果是的話,你會怎麼做,因爲我看到的例子是數組,所以我對如何編寫代碼感到困惑 – blastme

+0

@blastme是的,我們可以使用'compact()'。這個PHP函數根據當前作用域中的變量創建一個數組。我們將所需的變量名稱作爲字符串傳遞:compact('personalInfos')'。就我個人而言,我不喜歡它,但有些人喜歡。但是,如果你仍然得到這個錯誤,'compact()'不會有幫助。看起來像一個不同的控制器方法返回視圖(沒有數據)。您可以通過在控制器方法的開頭添加一個'dd('test')'來進行測試。 –

+0

在同一個控制器中,已經創建了一個默認函數,但是我不敢碰它,這是否是原因?公共職能索引() { return view('home'); }和路由「Route :: get('/ home','HomeController @ index') - > name('home');」那麼我會把這2個出來嗎?因爲當我刪除它時,它會告訴我找不到頁面。對不起,這裏的雜亂文字,我不知道如何正確格式化 – blastme

0

按照兩種方式將多個變量傳遞給view

//Passing variable to view using with Method 
return view('home')->with(['test'=>personal_info::find($id),'data'=>$data['data']]); 

//Passing variable to view using Associative Array 
return view('home', ['test'=>personal_info::find($id),'data'=>$data['data']]); 
+0

nope仍然是相同的錯誤 – blastme

+0

你確定'$ data'已經填充或者它會/可以是空的嗎?在這種情況下,添加一個檢查刀片「@if(isset($ data))'。這意味着,它進入其他地方,而不是處於「如果」狀態。 –

+0

在添加此部分之前 - >('test',personal_info :: find($ id));「我能夠獲取數據,但因爲我想通過ID來獲取它,所以我添加了該代碼,但在此之後出現了一個錯誤,所以可能是因爲我的路由或控制器問題,當我嘗試查找ID時? – blastme

相關問題