我有两张桌子。表reports
report_id | user_id | item_id
和reports_messages
report_id | user_id | item_id | messages
我想删除report_id
reports
上与report_id
中reports_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。
}
答案 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');
当您执行此类操作时,只要从数据库中删除消息或报表而无需分离方法,数据透视表数据都将被删除。 如果邮件或报告与其他数据有关联,这是最好的选择,这样,当删除数据时,邮件应自动删除,在这种情况下,我们不必担心再次分离数据