Laravel有许多分离

ka_*_*lin 9 php eloquent laravel-5.1

我在Eloquent中遇到了关于删除子模型的问题:当执行此操作时,process2()我仍然有删除的模型,这是不正常的.

模型

    namespace App\Models;

    use Illuminate\Database\Eloquent\Model;

    class Model1 extends Model
    {
        public function seasons() {
            return $this->hasMany('App\Models\Seasons', 'series_id', 'id');
        }
    }
Run Code Online (Sandbox Code Playgroud)

服务

class Process {
    public function process1($model1Instance) {

        for($model1Instance->seasons() as $season) {
            if(//whatever//) {
                $season->delete();
            }
        }
    }
    public function process2($model1Instance) {
        for($model1Instance->seasons() as $season) {
            //At this point I still have the deleted instance
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

用法

$proc = new Process();
......
$proc->process1($model1Instance);
$proc->process2($model1Instance);
Run Code Online (Sandbox Code Playgroud)

process1()将删除父的模型,我怎么可以把它去掉process2()

尝试/将尝试:

1.方法:$ model1Instance-> seasons() - > detach($ season); 但得到了:Call to undefined method Illuminate\Database\Query\Builder::detach()

2.另一个类我可以制作另一个简单的类来存储这些但我不认为它没关系,虽然我可以设置过滤季节但仍然必须使用Model1实例:

class Model1Copy {
    private $seasons;
    public function __construct($seasons) {
        $this->seasons = $seasons;
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 尝试时致命:

    public function process1($ model1Instance){

    for($model1Instance->seasons() as $season) {
        if(//whatever//) {
            $season->delete();
        } else {
        $childs[]=$season;
        }
    }
    $model1Instance->seasons = $childs
    
    Run Code Online (Sandbox Code Playgroud)

    }

  2. 将我自己的存储库跳过ORM的行为,但它令人沮丧,因为我必须重写所有查询只是为了删除一个实例...

Ere*_*ald 5

删除hasMany有条件的记录:

$model1Instance->seasons()->where('condition', 'met')->delete();
Run Code Online (Sandbox Code Playgroud)

全部删除:

$model1Instance->seasons()->delete();
Run Code Online (Sandbox Code Playgroud)


Joh*_*pit 0

$model->seasons()返回关系,而$model->seasons返回映射到模型的季节集合。尝试以下操作。

public function process1($model1Instance) {

    // Iterate over the collection
    for($model1Instance->seasons as $season) {
        if(condition) {
            $model1Instance->seasons()->detach($season); 
            $season->delete();
        }
    }

    $model1Instance->save();
}
Run Code Online (Sandbox Code Playgroud)

此外,您还迭代所有模型的所有季节,并删除满足某些条件的季节。如果一口气毁掉所有季节,岂不是更有效率。像下面这样:

$seasons = Season::where(condition)->get();
Season::destroy($seasons);
Run Code Online (Sandbox Code Playgroud)