Laravel 不使用 Eloquent 更新项目
Posted
技术标签:
【中文标题】Laravel 不使用 Eloquent 更新项目【英文标题】:Laravel Not Updating Item Using Eloquent 【发布时间】:2017-03-31 03:17:44 【问题描述】:我正在尝试将标记功能添加到我的网络应用程序中,但它似乎只工作了一半。我可以标记一个特定的资源,添加我标记的原因以及其他 cmets 就好了。一旦我查看了所有标记的资源,原因和 cmets 就会保存并更正,但我标记的资源都是相同的,在本例中为“救世军”。例如,我有 4 个被标记的资源,它们都显示了不同的被标记原因,但即使我没有标记“救世军”,资源本身也是一样的。
这是我的一些代码,希望你能帮助我弄清楚为什么 Eloquent 没有更新我在数据库中的项目:
资源模型
class Resources extends Model
protected $table = 'Resources';
protected $primaryKey = 'Resource_ID';
public $timestamps = false;
protected $fillable = [
'Name',
'Description',
'Misc_Info',
'Flagged'
];
protected $guarded = [];
//referencing the pivot table for Flagged and Resources
public function flags()
return $this->belongsToMany('App\Models\Flagged', 'FlaggedResources', 'Resource_ID', 'Flag_ID');
标志模型
class Flagged extends Model
protected $table = 'Flagged';
protected $primaryKey = 'Flag_ID';
public $timestamps = false;
protected $fillable = [
'Flag_Reason',
'Other_Comments'
];
protected $guarded = [];
//references the pivot table for Flagged and Resources
public function resource()
return $this->belongsToMany('App\Models\Resource', 'FlaggedResources');
标记资源模型
class FlaggedResources extends Model
protected $table = 'FlaggedResources';
public $timestamps = false;
protected $fillable = [
'Resource_ID',
'Flag_ID'
];
protected $guarded = [];
标志控制器
public function index()
$resource = Resources::where('Flagged', 1)->with('flags')->get();
$flag = Flagged::all();
return view('pages.flags', ['flagged' => $resource], ['flag' => $flag]);
public function addFlag($id)
$resource = Resources::where('Resource_ID', '=', $id)->update(array('Flagged' => 1));
$flag = Flagged::create(Request::all());
$resource->save();
$flag->save();
return back();
如果Flagged=1
它会显示在视图中,如果Flagged=0
它不会显示。
标志视图
<table class=" display table table-hover table-bordered" , id="flaggedResources">
<thead>
<th>Name</th>
<th>Description</th>
<th>Flagged Reason</th>
<th>Other Comments</th>
<th>Functions</th>
</thead>
<tbody>
@foreach ($flagged as $flags) @foreach ($flag as $flaggedRes)
<tr>
<td> $flags->Name </td>
<td> $flags->Description </td>
<td> $flaggedRes -> Flag_Reason </td>
<td> $flaggedRes -> Other_Comments </td>
@endforeach @endforeach
</tbody>
</table>
当我检查 mysqlWorkbench 以检查是否进行了任何更改时,我的 Resources 表没有任何更改,但数据已输入到我的 Flagged 表中。之前尝试开发标记功能的开发人员将该 1 硬编码为“救世军”,这就是为什么只有那个在数据库中被标记的原因。此外,没有数据被插入到数据透视表中。
如果有人可以帮助我解决这个问题,我将不胜感激,我已经被这个问题困扰了大约一个月。
编辑 我已经添加了一些资源和标记 SQL 表的图片,希望它能帮助诊断问题
编辑 2
我知道为什么它没有更新 Resources 表,我有另一个名为 PostFlag
的方法,它只是插入 Flag_Reason
和 Other_Comments
而没有对 Resources
做任何事情,并且路由正在调用 @ 987654338@。现在我很困惑如何设置我的路线。在我编辑PostFlag
方法以更新Resource
表后,我现在拥有的路线是
Route::post('resource', ['as' => 'resource', 'uses'=>'FlagsController@postFlag']);
如果我不触摸路线,我会在加载标记资源视图时收到Missing argument 1 for App\Http\Controllers\FlagsController::postFlag()
错误。如果我编辑路线以获取像 Route::post('resource/Resource_ID', ['as' => 'resource', 'uses'=>'FlagsController@postFlag']);
这样的 ID,我会得到一个 Missing required parameters for [Route: resource] [URI: resource/Resource_ID])
。我是否需要设置获取路线,如果需要,我该如何设置?
【问题讨论】:
【参考方案1】:说实话,当您每次都创建一个新标志然后将其与资源关联时,我不确定您为什么真的使用belongsToMany
关系。 资源在此处hasMany('App\Models\Flagged')
和标记 belongsTo('App\Models\Resources')
。但是...我的意思是,当您已经决定使用数据透视表时,我真的不能建议进行如此巨大的数据库更改。无论如何,我相信会为你解决一切……
第 1 部分
首先进行以下更改
在班级Resources
public function flags()
return $this->belongsToMany('App\Models\Flagged', 'FlaggedResources')->withPivot(['Resource_ID', 'Flag_ID']);
在班级Flagged
public function resources()
return $this->belongsToMany('App\Models\Resource', 'FlaggedResources')->withPivot(['Resource_ID', 'Flag_ID']);
不需要FlaggedResources
类。请删除那个。
第 2 部分
现在,在 控制器
public function index()
$resources = Resources::where('Flagged', 1)->with('flags')->get();
return view('pages.flags', ['resources' => $resources]);
public function addFlag($id)
$flag = Flagged::create(Request::all());
$resource = Resources::findOrFail($id);
$resource->update(array('Flagged' => 1));
$resource->flags()->attach([$flag->id]);
return back();
在视图
@foreach ($resources as $resource)
<tr>
<td> $resource->Name </td>
<td> $resource->Description </td>
<td> $resource->flags ? $resource->flags->first()->Flag_Reason : 'None' </td>
<td> $resource->flags ? $resource->flags->first()->Other_Comments : 'None' </td>
</tr>
@endforeach
希望这会有所帮助:)
【讨论】:
感谢您的帮助,Flag Reason & Other Comments
已插入数据库,没有任何内容插入到数据透视表 FlaggedResources
中,Resources
表中的 Flagged
字段未更改。我在这些行<td> $resource->flags ? $resource->flags->first()->Other_Comments </td>
上也遇到语法错误,它说:
应该在Other_Comments and Flag_Reason
之后。
好的,所以我修改了您的 2 个 <td>
语句,使其看起来像这样 <td> $resource->flags->Other_Comments </td>
视图现在加载,但无论我标记什么,表视图都没有任何内容,但原因和 cmets仍在插入数据库中。
@JDubbleU 哦,是的,对不起......我忘了在内联条件语句中写 OR 部分......我已经编辑了我的答案(视图部分)。你能再试一次,让我知道它是否有效:)
我改了,但功能上没有区别。我的Resources
表中的“已标记”字段仍保持为 0,而不是更新为 1,并且 Flag_Reason and Other_Comments
被插入到 Flagged
表中。我不知道为什么我的Resources
表没有更新。以上是关于Laravel 不使用 Eloquent 更新项目的主要内容,如果未能解决你的问题,请参考以下文章
Laravel Eloquent - 保存/更新相关的一对多关系数据