在Laravel

时间:2017-01-26 15:06:25

标签: php laravel laravel-5

我有两张桌子。表reports

report_id | user_id | item_id

reports_messages

report_id | user_id | item_id | messages

我想删除report_id reports上与report_idreports_messages匹配的所有相关行的public function reports(){ return $this->belongsTo('App\Report'); } public function item(){ return $this->belongsTo('App\Item', 'item_id', 'id'); }

在我的ReportMessages模型中,我有这种关系

public function reportedItem(){

    return $this->belongsTo('App\Item');
}

public function user(){
    return $this->hasOne('App\User', 'id', 'user_id');
}

在报告模型中

public function destroy($report_id){

    Report::destroy($report_id);
    ReportMessages::find(1)->reports()->where('report_id',$report_id)->delete();

    return redirect()->route('user.ports');

到目前为止,我已尝试在SO

上创建此解决方案
reports

仅在public class RxZipFlatMapTest { @Test public void testZipFlatMap() { Observable.zip(getDummyList(), getActualList(), new Func2<String, String, String>() { @Override public String call(String s, String s2) { return "hi " + s + " " + s2; } }).toBlocking().first(); System.out.println("Done"); } private Observable<String> getActualList() { return Observable.create(new TestObservable()).subscribeOn(Schedulers.newThread()); } private Observable<String> getDummyList() { return Observable.create(new TestObservable2()).subscribeOn(Schedulers.newThread()); } private abstract class TestAbstractObservable implements Observable.OnSubscribe<String> { } private class TestObservable extends TestAbstractObservable { @Override public void call(Subscriber<? super String> subscriber) { Set<String> strList = new HashSet<>(); strList.addAll(Arrays.asList("pranesh", "uma")); Observable.from(strList).flatMap(Async.toAsync(new Func1<String, Object>() { @Override public Object call(String s) { return s; } }, Schedulers.newThread())).toList().toBlocking().single(); subscriber.onNext("hello "); subscriber.onCompleted(); } } private class TestObservable2 extends TestAbstractObservable { @Override public void call(Subscriber<? super String> subscriber) { Set<String> strList = new HashSet<>(); strList.addAll(Arrays.asList("sunu", "lakshmi")); Observable.from(strList).flatMap(Async.toAsync(new Func1<String, Object>() { @Override public Object call(String s) { return s; } }, Schedulers.newThread())).toList().toBlocking().single(); subscriber.onNext("hi "); subscriber.onCompleted(); } } } 中删除..不会删除数据透视表中的相关report_id。     }

2 个答案:

答案 0 :(得分:3)

Laravel具有处理数据透视表的函数detach and attach。 因此,您可以执行此操作以删除数据透视表中的记录:

ReportMessages::find(1)->reports()->detach($report_id);

但是,这不会删除报表中的行,因为它仍然可以链接到另一个对象。

<强>更新
所以,我刚注意到,你没有数据透视表,你只有两个链接的模型。

您不必在查询中加载reports()关系即可删除ReportMessages,您可以这样做:

Report::destroy($report_id);
ReportMessages::where('report_id',$report_id)->delete();

这将删除报告和所有相应的报告消息。

答案 1 :(得分:0)

我知道我来晚了,但是这种关系的最佳选择,最好是在表“ reports_messages”中为以下特定链接表定义外键

> $table->integer('report_id')->unsigned()->index(); $table->foreign('report_id')->references('id')->on('reports')->onDelete('cascade'); $table->integer('message_id')->unsigned()->index(); $table->foreign('message_id')->references('id')->on('messages')->onDelete('cascade');

当您执行此类操作时,只要从数据库中删除消息或报表而无需分离方法,数据透视表数据都将被删除。  如果邮件或报告与其他数据有关联,这是最好的选择,这样,当删除数据时,邮件应自动删除,在这种情况下,我们不必担心再次分离数据