Php Laravel5.x将两个模型与关系保存为一种形式

Php Laravel5.x将两个模型与关系保存为一种形式,php,laravel,laravel-5,Php,Laravel,Laravel 5,我研究了应用程序,现在我想基于它创建一个更复杂的应用程序 我正在创建一个每日日志应用程序来研究模型依赖关系。我有三种模式:User、DayLog和Task Users有许多DayLogs DayLogs可以有许多任务(可选)。 Users和DayLog的关系和CRUD正常工作,这是直接从教程中删除的 现在我想保存一个DayLog和一个Task,我很难完成这个任务 以下是我的模型,表明了前面讨论的关系: // User.php public function dayLogs() { r

我研究了应用程序,现在我想基于它创建一个更复杂的应用程序

我正在创建一个每日日志应用程序来研究模型依赖关系。我有三种模式:
User
DayLog
Task

  • User
    s有许多
    DayLog
    s
  • DayLog
    s可以有许多
    任务
    (可选)。
  • User
    s和
    DayLog
    的关系和CRUD正常工作,这是直接从教程中删除的
现在我想保存一个
DayLog
和一个
Task
,我很难完成这个任务

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

// 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);
}
目前我正在开发后端。我正在尝试将
任务
与正在保存的
日志
关联:

// 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()
不在

  • 基本上,我希望成功地将内联
    任务
    保存为上述方法中
    日志
    的一部分

  • 使用本机雄辩的方法是否无法实现这一点?如果可以,我是否应该查看查询生成器?如果没有,请分享如何做到这一点与雄辩


我希望您能帮我解决这个问题。

更新belongsTo方法时,请使用以下方法:


您已将方法
user()
daylog()
task()
添加到您的模型中,但是您试图在
Request$Request
上使用它们<代码>$request只包含您从前端发送给他的数据,它与您的数据库无关。您应该对从现有(
$daylog=daylog::where('name',$request->daylog\u name)->first()
)或新(
$daylog=daylog::create(['name'=>$request->daylog\u name])
获取的模型实体使用这些方法,然后您可以像这样使用它们(['task\u name'=>'My new task'.date('Ymd')])和
$user->daylogs()->保存($daylog)

方法
user()
$request
上工作的原因是您使用默认的laravel身份验证,这可以通过这种方式获取当前已验证的用户,因此您可以获取当前用户实体,如
$user=$request->user()
。了解此方法
user()
$request
上使用的是默认的laravel方法,与在
$daylog->user()上使用的方法不同

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


我得到
调用未定义的方法\Database\Query\Builder::associate()
这很奇怪,因为我假设这是从
模型
超类继承的方法,或者我应该在
DayLog.php
中显式定义它吗?谢谢!下一个问题,当我获取
DayLog
时,它的
任务
为什么不包括在内(即
$this->daylogs->getAllByUser($request->user())
)?当我执行
{{{$daylog->tasks}时,它们不可用
在前端。鉴于
日志
外键,这是我单独获取
任务
的正常行为吗?很抱歉告诉您,我真的很想了解这一点以及这些具体问题,我想您现在可以使用。关于Laravel身份验证,我从教程中了解到,
 数据库中的合法
用户
s引入用户
来过滤
任务
s;我的问题是我是否需要这样做(即为
日志
s及其
任务
s添加身份验证)对于属于我的
DayLog
s的
Task
s,或者这是因为外键约束导致的过度杀伤力吗?当您获取model elount时,它不会获取它的所有关系,因此如果您需要前端的一些关系,您可以覆盖
toArray()
方法,或者添加一个新的方法并在发送之前调用它,在其中创建需要发送的关系数组,并在返回之前将其附加到
$this->toArray()
数组。例如
$arrayDaylog=$this->toArray()
$tasks=$this->tasks()->->toArray(),
$arrayDaylog['tasks']=$tasks
return$arrayDaylog
只要我把你的问题弄清楚,外键约束就足够了,你不需要那个
DayLogRepository
参数,只需访问
任务
模型
daylog()
$task = new Task();
$task->name = "My new task ".date('Ymd');  

$request->user()->daylogs()->->create([
           'name' => $request->daylog_name,
  ])->associate($task);