有很多通过更新/与枢轴 laravel 5.5
Has many through update / with pivot laravel 5.5
我有好几个 table(都带有 created_at、updated_at、deleted_at):
- 扇区
- lang_sector
- 价值链
- lang_valuechain
- 段
- lang_segment
- 关键需求
- keyneed_lang
table 的链接顺序如下:
行业有很多价值链
价值链有很多部分
细分有很多关键需求
这是我的模型:
namespace App;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class Sector extends Model
{
use SoftDeletes;
protected $table = "sectors";
protected $fillable = ['admin_id'];
protected $dates = [ 'created_at', 'updated_at', 'deleted_at' ];
public function langs() {
return $this->belongsToMany('App\Lang')
->withPivot('sectname', 'sectshortname', 'segname_slug',
'sectdescription', 'sectshortdescription'
)
->withTimestamps();
}
public function admin()
{
return $this->belongsTo('App\Admin');
}
public function valuechains()
{
return $this->hasMany('App\Valuechain');
}
public function segments()
{
return $this->hasManyThrough('App\Segment', 'App\Valuechain');
}
public function keyneeds()
{
return $this->hasManyThrough('App\Keyneed', 'App\Segment', 'App\Valuechain');
}
}
在我的销毁控制器中:
public function destroy($id)
{
$sector = Sector::findOrFail($id);
$sector_ids = $sector->langs()->allRelatedIds();
foreach ($sector_ids as $id){
$sector->langs()->updateExistingPivot($id, ['lang_sector.deleted_at' => Carbon::now()]);
}
$sector->valuechains()->update( [ 'valuechains.deleted_at' => Carbon::now() ] );
$sector->segments()->update( [ 'segments.deleted_at' => Carbon::now() ] );
$sector->keyneeds()->update( [ 'keyneeds.deleted_at' => Carbon::now() ] );
Sector::where('id', $id)->delete();
return redirect()->route('sectors.index')->with('success', 'Sector deleted');
}
我的问题是它不会更新以下 tables:细分和关键需求(具有 created_at、updated_at 和 deleted_at 字段)及其pivot tables 也是...而且我有一条错误消息:
SQLSTATE[23000]:违反完整性约束:1052 字段:字段列表中的 'updated_at' 不明确(SQL:更新 segments
内部连接 valuechains
在 valuechains
.id
= segments
.valuechain_id
设置 segments
.deleted_at
= 2018-05-10 06:54:54, updated_at
= 2018-05-10 06:54:54 其中 valuechains
.sector_id
= 2)
它添加了:updated_at
我更新成功了:
- 扇区table
- 价值链table
- lang_valuechain 枢轴
我的问题是更新
- 段 table 使用:$sector->segments()
- keyneeds table 通过使用:$sector->keyneeds()
还有他们的支点 table...我阅读了文档,但没有帮助。
我使用 update() 方法,因为 $sector->segments()->delete() 正在尝试进行硬删除...
我终于找到了一个问题.. 不是很优雅,但它在 "main" 表上工作。我必须解决数据透视表上的小问题:
public function destroy($id)
{
$sector = Sector::findOrFail($id);
$valuechains = Valuechain::where('sector_id','=',$sector->id)->get();
foreach ($valuechains as $valuechain) {
$segments = Segment::where('valuechain_id', '=', $valuechain->id )->get();
$valuechain->langs()->updateExistingPivot($valuechain->id, ['lang_valuechain.deleted_at' => Carbon::now()]);
foreach ($segments as $segment) {
$keyneeds = Keyneed::where('segment_id', '=', $segment->id)->get();
$segment->langs()->updateExistingPivot($segment->id, ['lang_segment.deleted_at' => Carbon::now()]);
$segment->delete();
foreach ($keyneeds as $keyneed) {
$keyneed->langs()->updateExistingPivot($keyneed->id, ['keyneed_lang.deleted_at' => Carbon::now()]);
$keyneed->delete();
}
}
$valuechain->delete();
}
$sector->langs()->updateExistingPivot($id, ['lang_sector.deleted_at' => Carbon::now()]);
$sector->delete();
return redirect()->route('sectors.index')->with('success', 'Secteur suppprimé');
}
我有好几个 table(都带有 created_at、updated_at、deleted_at):
- 扇区
- lang_sector
- 价值链
- lang_valuechain
- 段
- lang_segment
- 关键需求
- keyneed_lang
table 的链接顺序如下: 行业有很多价值链 价值链有很多部分 细分有很多关键需求
这是我的模型:
namespace App;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class Sector extends Model
{
use SoftDeletes;
protected $table = "sectors";
protected $fillable = ['admin_id'];
protected $dates = [ 'created_at', 'updated_at', 'deleted_at' ];
public function langs() {
return $this->belongsToMany('App\Lang')
->withPivot('sectname', 'sectshortname', 'segname_slug',
'sectdescription', 'sectshortdescription'
)
->withTimestamps();
}
public function admin()
{
return $this->belongsTo('App\Admin');
}
public function valuechains()
{
return $this->hasMany('App\Valuechain');
}
public function segments()
{
return $this->hasManyThrough('App\Segment', 'App\Valuechain');
}
public function keyneeds()
{
return $this->hasManyThrough('App\Keyneed', 'App\Segment', 'App\Valuechain');
}
}
在我的销毁控制器中:
public function destroy($id)
{
$sector = Sector::findOrFail($id);
$sector_ids = $sector->langs()->allRelatedIds();
foreach ($sector_ids as $id){
$sector->langs()->updateExistingPivot($id, ['lang_sector.deleted_at' => Carbon::now()]);
}
$sector->valuechains()->update( [ 'valuechains.deleted_at' => Carbon::now() ] );
$sector->segments()->update( [ 'segments.deleted_at' => Carbon::now() ] );
$sector->keyneeds()->update( [ 'keyneeds.deleted_at' => Carbon::now() ] );
Sector::where('id', $id)->delete();
return redirect()->route('sectors.index')->with('success', 'Sector deleted');
}
我的问题是它不会更新以下 tables:细分和关键需求(具有 created_at、updated_at 和 deleted_at 字段)及其pivot tables 也是...而且我有一条错误消息:
SQLSTATE[23000]:违反完整性约束:1052 字段:字段列表中的 'updated_at' 不明确(SQL:更新 segments
内部连接 valuechains
在 valuechains
.id
= segments
.valuechain_id
设置 segments
.deleted_at
= 2018-05-10 06:54:54, updated_at
= 2018-05-10 06:54:54 其中 valuechains
.sector_id
= 2)
它添加了:updated_at
我更新成功了:
- 扇区table
- 价值链table
- lang_valuechain 枢轴
我的问题是更新
- 段 table 使用:$sector->segments()
- keyneeds table 通过使用:$sector->keyneeds()
还有他们的支点 table...我阅读了文档,但没有帮助。 我使用 update() 方法,因为 $sector->segments()->delete() 正在尝试进行硬删除...
我终于找到了一个问题.. 不是很优雅,但它在 "main" 表上工作。我必须解决数据透视表上的小问题:
public function destroy($id)
{
$sector = Sector::findOrFail($id);
$valuechains = Valuechain::where('sector_id','=',$sector->id)->get();
foreach ($valuechains as $valuechain) {
$segments = Segment::where('valuechain_id', '=', $valuechain->id )->get();
$valuechain->langs()->updateExistingPivot($valuechain->id, ['lang_valuechain.deleted_at' => Carbon::now()]);
foreach ($segments as $segment) {
$keyneeds = Keyneed::where('segment_id', '=', $segment->id)->get();
$segment->langs()->updateExistingPivot($segment->id, ['lang_segment.deleted_at' => Carbon::now()]);
$segment->delete();
foreach ($keyneeds as $keyneed) {
$keyneed->langs()->updateExistingPivot($keyneed->id, ['keyneed_lang.deleted_at' => Carbon::now()]);
$keyneed->delete();
}
}
$valuechain->delete();
}
$sector->langs()->updateExistingPivot($id, ['lang_sector.deleted_at' => Carbon::now()]);
$sector->delete();
return redirect()->route('sectors.index')->with('success', 'Secteur suppprimé');
}