如何在模型中传递原始查询的Id,它没有主键?

时间:2017-08-24 00:02:14

标签: php laravel eloquent

我的模型定义如下( ps :我在此模型类中使用的视图没有主键,是: vwAlarmActionSummaryYFUserSite

class Alarm extends Model
{
    protected $table = 'vwAlarmActionSummaryYFUserSite';
    public $timestamps  = false ;

    public function scopeActiveAlarms($query)
    {
        return $query->whereDate('AlarmClearedUTCDateTime', '=', '9999-12-31 23:59:59.9999999'); 
    }

    public function alarmActionDescription()
    {
        $rec = \DB::table('vwAlarmActionSummary')
            ->where('AlarmId', '=', $this->AlarmId);

        return $rec;
    }

}

我在模型之上调用;

 $alarm = Alarm::where('AlarmId', $id)->where('yfUserID', $yfUserID)->firstOrFail();

现在我在alarmActionDescription()方法获得此异常;

(1/2) LogicException
Relationship method must return an object of type Illuminate\Database\Eloquent\Relations\Relation
in HasAttributes.php (line 403)
at Model->getRelationshipFromMethod('AlarmActionDescription')
in HasAttributes.php (line 386)
at Model->getRelationValue('AlarmActionDescription')
in HasAttributes.php (line 316)

我想从vwAlarmActionSummary表中返回一行,因为我正在传递AlarmId,它从我的控制器传递为$id

这里有什么问题?如何修改我的alarmActionDescription()方法以根据AlarmId返回一行?

1 个答案:

答案 0 :(得分:0)

您似乎错误地调用了方法alarmActionDescription()

像这样:

$alarm->alarmActionDescription;

调用它就像是一个属性。这样做,Laravel假设您正在尝试获取关系列表。例如,在您的闹钟中,您有:

public function users() {
    return $this->belongsToMany(User::class);
}

如果你这样做:

$alarm->users;

您将收到与您的闹钟相关的一组用户。

请注意,您使用与我们之前声明的功能相同的名称来调用属性

但如果你这样做:

$alarm->users();

它将执行该功能并返回一个关系,即belongsToMany()

但是,在您的情况下,功能alarmActionDescription(),您没有返回关系,您将从返回数据库中。

您可以做的是,调用方法如:

$alarm->alarmActionDescription();

与你所说的你所做的相反:

$alarm->alarmActionDescription;

注意差异。

了解更多信息:https://laravel.com/docs/5.4/eloquent-relationships