Laravel 4 - 发送数据控制器以查看

时间:2014-07-26 08:58:18

标签: php laravel laravel-4

概述:

我有这个方法getDailyTimeRecordEntry()

public function getDailyTimeRecordEntry($record_id = false) {

    $user_id = Auth::user()->id;

    $dtr =  DailyTimeRecord::where('id', '=', $record_id)
            ->where('user_id', '=', $user_id);

    if ($dtr->count() > 0) { 
        $dtr = $dtr->first();
    } else if ($dtr->count() == 0 && $record_id != false) {

        // If other user accessing someone's record id, will redirect
        return  Redirect::route('dashboard-shinra')
                ->with('failure', 'The hell are you accessing someone\'s record?');
    }

    // if the dtr->count() is 0 or has a value it still send the data to view
    return  View::make('dashboard.shinra.dtr_entry')
            ->with('dtr', $dtr);
}

因此,我们知道该网址是否具有记录ID参数或空白,它仍会发送我传递给视图的dtr

没有参数: www.mydomain.com/dashboard/shinra/daily-time-record-entry

带参数: www.mydomain.com/dashboard/shinra/daily-time-record-entry/2

所以在视图dashboard.shinra.dtr_entry

我有一行代码,其中包含dtr个变量。

<input type="text" name="date" value="{{ ($dtr->date) ? $dtr->date : '' }}">

所以,如果我们访问

www.mydomain.com/dashboard/shinra/daily-time-record-entry/1

所有记录都将在文本字段中输出,如上面的输入。因为参数1在数据库中有记录。

所以,如果我访问

www.mydomain.com/dashboard/shinra/daily-time-record-entry

没有参数,我遇到了错误

enter image description here

我知道这是因为这个

{{ ($dtr->date) ? $dtr->date : '' }}

但是,有没有解决这个问题?

我甚至尝试过

{{ (isset($dtr->date)) ? $dtr->date : '' }}

仍然无法工作。

3 个答案:

答案 0 :(得分:1)

在您的方法getDailyTimeRecordEntry()中,您还应该在($dtr->count() == 0 && $record_id == false)$record_id时处理案例false。否则,您可能会遇到get()first() $dtr查询的情况。

所以你应该:

public function getDailyTimeRecordEntry($record_id = false) {

    $user_id = Auth::user()->id;

    $dtr =  DailyTimeRecord::where('id', '=', $record_id)
            ->where('user_id', '=', $user_id);

    if ($dtr->count() > 0) { 
        $dtr = $dtr->first();
    } else if ($dtr->count() == 0 && $record_id != false) {

        // If other user accessing someone's record id, will redirect
        return  Redirect::route('dashboard-shinra')
                ->with('failure', 'The hell are you accessing someone\'s record?');
    } else {
        // return something or make sure you do $dtr = $dtr->first() here
        $dtr = $dtr->first();
    }

    // if the dtr->count() is 0 or has a value it still send the data to view
    return  View::make('dashboard.shinra.dtr_entry')
            ->with('dtr', $dtr);
}

此外,您可以在Blade中为三元运算符使用更简单的语法。而不是写

{{ (isset($dtr->date)) ? $dtr->date : '' }}

你可以写

{{ $dtr->date or '' }}

答案 1 :(得分:1)

问题是边缘情况,当count为0且你从不执行查询时。

首先,我建议适当地命名变量:

$query =  DailyTimeRecord::where('id', '=', $record_id)
        ->where('user_id', '=', $user_id);
...

$dtr = $query->first(); // or whatever
...
return View::make()->with('dtr', $dtr);

然后你就会知道$dtr没有设置,所以调试非常简单。

现在,您的代码执行不必要的查询:

// 1st query
if ($dtr->count() > 0) { 
// 2nd query if passed
    $dtr = $dtr->first();

// 2nd query if didn't pass
} else if ($dtr->count() == 0 && $record_id != false) {

虽然你可以像这样简单地做到这一点:

$dtr = DailyTimeRecord::where('id', '=', $record_id)
        ->where('user_id', '=', $user_id)
        ->first();

if ( ! count($dtr))
{
  return ... // ERROR
}

return ... // correct row returned

答案 2 :(得分:0)

对我而言,如果您没有设置参数,则id将为0.这意味着您将在$ dtr中获取空集合并将该空集合传递给视图。而不是你试图访问你认为是模型的属性,但实际上它是一个集合。

根据没有参数传递给控制器​​操作时db返回的内容,可能会出现这种情况。