Laravel 5.x以一种形式保存两个关系模型

时间:2017-03-05 09:14:37

标签: php laravel laravel-5

我研究了Laravel Intermediate Task tutorial,现在我想根据它创建一个更复杂的应用程序。

我正在创建一个日常日志应用来研究模型依赖项。我有三个模型:UserDayLogTask

  • User有很多DayLog s。
  • DayLog s 可以有多个Tasks(可选)。
  • UserDayLog的关系和CRUD工作正常,直接从教程中解除。

现在我要保存一个DayLog Task,但我很难实现。{/ p>

以下是我的模型,表明之前讨论的关系:

// User.php
public function dayLogs()
{
    return $this->hasMany(DayLog::class);
}

// DayLog.php
public function user()
{
    return $this->belongsTo(User::class);
}
public function task()
{
    return $this->hasMany(Task::class);
}

// Task.php
public function dayLog()
{
    return $this->belongsTo(DayLog::class);
}

目前我正在后端开发。我正在尝试将Task与正在保存的DayLog相关联:

// DayLogController.php
public function create(Request $request)
{
    $this->validate($request, [
        'daylog_name' => 'required|max:255',
    ]);

    // Create dummy Task
    $task = new Task();
    $task->name = "My new task ".date('Ymd');

    // Save Task to the current DayLog - NOK
    $request->daylog()->tasks()->create([
        'task_name' => $task->name,
    ]);

    // Save DayLog to User - OK
    $request->user()->daylogs()->create([
        'name' => $request->daylog_name,
    ]);

    return redirect('/daylogs');
}

这显示错误:

  

Macroable.php第74行中的BadMethodCallException:

     

方法daylog不存在。

我不明白为什么user()位于$request,而daylog()不是。{/ p>

  • 基本上我想成功将内联Task保存为上述方法中DayLog的一部分。

  • 使用本机Eloquent方法无法实现这一点,如果是,我应该查看查询构建器吗?如果没有,请与Eloquent分享如何实现这一目标。

我希望你能帮助我。

2 个答案:

答案 0 :(得分:1)

您已将方法user()daylog()task()添加到模型中,但是您尝试在Request $request上使用它们。 $request仅包含您从前端发送给他的数据,它与您的数据库无关。您应该在模型实体上使用这些方法,这些方法可以从现有($daylog = Daylog::where('name', $request->daylog_name)->first()或新的$daylog = Daylog::create(['name' => $request->daylog_name]))获得,然后您可以像$daylog->tasks()->create(['task_name' => 'My new task '.date('Ymd')])和{{1 }。

方法$user->daylogs()->save($daylog)适用于user()的原因是您使用默认的laravel身份验证,这可以通过这种方式获取当前经过身份验证的用户,这样您就可以获得当前用户用户实体,如{{ 1}}。重要的是要了解您在$request上使用的此方法$user = $request->user()是默认的laravel方法,与您在user()上使用的方法不同。

以下是您可能会发现有用的文档链接:

Eloquent ORM

Authentication

答案 1 :(得分:0)

更新belongsTo方法时,请使用associate()方法:

# coding: utf8
import csv
import twitter
CONSUMER_KEY = '...'
CONSUMER_SECRET = '...'
ACCESS_TOKEN = '...'
ACCESS_TOKEN_SECRET = '...'
api = twitter.Api(consumer_key=CONSUMER_KEY,
                  consumer_secret=CONSUMER_SECRET,
                  access_token_key=ACCESS_TOKEN,
                  access_token_secret=ACCESS_TOKEN_SECRET)

users = api.GetSearch(term=" ",lang="fr",count=200)
print users