【问题标题】:updating one to many relationship automatically自动更新一对多关系
【发布时间】:2017-01-16 23:02:15
【问题描述】:

我有两个表(通知和警报频率),它们各自的models。存在一对多的关系。有用。当我尝试自动更新它时,这就是我遇到问题的地方。简而言之,我的模型通知是:

class Notification extends Model
{
    public function alertFrequencies()
    {
        return $this->hasMany('App\AlertFrequency');
    }

    public function alert()
    {
        $alert_frequency = AlertFrequency::with('notification')
            ->orderBy('created_at', 'desc')->select('created_at')->first();
        if ($alert_frequency == null) {
            return false;
        }
        return $alert_frequency->created_at->toDateTimeString();
    }
}

它返回时间戳。

我想要在 guzzle 控制器中完成的是用notification_idalertFrequency 表中的字段)更新created_atalertFrequency 表中的字段)。代码如下

public function status()
{
    $notifications = Notification::where('active', 1)->get();
    $status = Status::where('name', 'health')->first();
    foreach ($notifications as $notification) {
        $this->updateStatus($notification, $status);
    }
}

private function updateStatus(Notification $notification, Status $status, AlertFrequency $alert)
{
    $status_health = $notification->status('health');
    $check = empty($status_health['timestamp']);
    $elapsed_time = $check ? 10000 : \Carbon\Carbon::parse($status_health['timestamp'])->diffInMinutes();
    $check_frequency = $this->getCheckFrequency($notification);
    if ($check || $elapsed_time >= $check_frequency) {
        $resCode = $this->getStatusCode($notification->website_url);
        $this->addStatusToNotification($notification, $status, $resCode);
        $this->sendNotification(
            $notification,
            $status_health,
            $this->getAlertFrequency($alert),
            $resCode
        );
        /*working right for alert*/
        var_dump($this->getAlertFrequency);
    }
}

private function getAlertFrequency(AlertFrequency $notification)
{
    if ($notification->alert() == null) {
        return false;
    }
    return $notification->alert();
}

直到函数更新,我能够var_dump() 值并且工作正常。但我不知道如何在status 函数中调用它,以便它会自动更新alerFrequency 表?非常感谢您的帮助!

【问题讨论】:

  • alerFrequency表的结构是什么
  • 这是一个简单的模型,具有多属关系::::public function notification(){ return $this->belongsTo('App\Notification'); }

标签: php laravel


【解决方案1】:

如果我理解正确,您想从status() 调用updateStatus() 方法。您不能将其作为 updateStatus() 期望 AlertFrequency 的实例作为参数。这就是问题所在。

如果是这样,像这样稍微改变你的 ``updateStatus() 方法,这样你就不需要传递AlertFrequency 作为参数。您可以在updateStatus() 方法中使用app() 方法解决它。

有了你的评论,我做了一些改变。

private function updateStatus(Notification $notification, Status $status)
{
     $alert = app(AlertFrequency::class);
    // Rest of your code here

    if ($check || $elapsed_time >= $check_frequency) {
        return $this->getAlertFrequency();
    }
    return null;
}

public function status()
{
    $notifications = Notification::where('active', 1)->get();
    $status = Status::where('name', 'health')->first();
    foreach ($notifications as $notification) {
        $frequency = $this->updateStatus($notification, $status);
        if (!empty($frequency)) {
            $notification->alertFrequencies()->create([
                'notification_id' => $frequency
            ]);
        }
    }
}

在使用 create 方法之前,请务必查看attribute mass assignment 上的文档。

【讨论】:

  • 你是对的,但是,如果你清楚我的问题,情况是这样的:状态函数更新数据库中的通知、状态和警报频率表。 notification 和 alertFrequency 有一对多的关系。无论如何,我应该能够得到alerfrequency表。
  • 你的回答给了我一个不同的见解,这就是为什么我改变了alerFrequency并添加了一些类! tnx
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-30
相关资源
最近更新 更多