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
s有许多User
sDayLog
s可以有许多DayLog
(可选)。任务
s和User
的关系和CRUD正常工作,这是直接从教程中删除的DayLog
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);