Laravel 实战开发知乎:实现编辑问题
打赏作者

软件的软啊软件的件

啊啊啊,口腔溃疡,开发员真的没法避免吗~ ,心疼站长~

JellyBool 回复 软件的软啊软件的件

这个真的是啊,我口腔溃疡比较频繁

Augus 回复 JellyBool

口佳宝 神药, 吃了一天恢复百分之八十, 2天就好了。
亲测有效

JellyBool 回复 Augus

这是 OTC 的药?直接可以药店购买?

Augus 回复 JellyBool

一般很难买到,淘宝直接购买。现在都涨价了。 我一次性买50盒,100盒的买。
我家里口腔溃疡也比较多, 上至我外婆,妈,效果非常好。以至于,我买了这么多都给我外婆,之前5-8块能买一盒,我外婆卖出了20块都有人抢。现在已经涨价了。我还能拿内部价。 哎呀卧槽。废话了这么多。 反正就是,有效,且放心使用。

nanibigoo 回复 Augus

进价八块卖20,赚12,买个一亿盒,你就发家致富了。。。。。我无聊了

zyzplzyz

请问群主,那个owns方法中传入的Model是

use Illuminate\Database\Eloquent\Model;

这个吗??
JellyBool 回复 zyzplzyz

恩,是的,就是 Eloquent Model

zyzplzyz

我在show试图中做判断,是否是登陆和是否是作者但是报错了

zyzplzyz

Argument 1 passed to App\User::owns() must be an instance of Illuminate\Database\Eloquent\Model, none given, called in /www/zhihu-app/storage/framework/views/f6b36f831c58c0492cf90e9a743a5974e8ecba7f.php on line 18 and defined (View: /www/zhihu-app/resources/views/questions/show.blade.php)

JellyBool 回复 zyzplzyz

你注意判断一下逻辑就可以,比如是是否登录等?

zyzplzyz 回复 JellyBool

恩,已经解决了

gcpark

@zyzplzyz
我也跟你一样有同样的错误提示 你是怎么解决的?

JellyBool 回复 gcpark

基本是没有登录,或者你传入的参数没对

a4922291 回复 JellyBool

登录了,传入的参数也是正确的ID,我这边是报owns这个方法有错

JellyBool 回复 a4922291

有错?具体是什么错误呢?代码又是什么呢?

Flourishing 回复 gcpark

在User.php 文件中 引入 use Illuminate\Database\Eloquent\Model; 就好了

weir2009

这节里面QuestionController的owns方法不太理解,老师能解释一下吗?

public function owns(Model $model)
    {
        return $this->id == $model->user_id;
    }
JellyBool 回复 weir2009

比如传入一个 Question:

$user->owns($question);
 // 就是判断 questions 表的 user_id 字段跟 users 表的id字段是否相等,answers 同理
weir2009 回复 JellyBool

谢谢,看懂了。。。新手有时候会在一些不可思议的地方转不过弯来。
前面有几个系列的语速有点快,跟不上节奏。知乎这个系列的语速很合适,每小节后面的总结也很好。

JellyBool 回复 weir2009

啊哈…一堆人都是1.5倍速播放。

多看一点就可以跟上节奏了,到你顿悟的时候,就很厉害了

noikiy

视频看到中间就卡了 下载也不好下载!

JellyBool 回复 noikiy

你是说下载视频也下载不了?

noikiy 回复 JellyBool

现在可以看了 也可以下载了 可能是我的100M的宽带不稳定

JellyBool 回复 noikiy

100M。。。那我感觉应该是 CDN 抽风吧。也可能是跟你没啥关系

JellyBool 回复 noikiy

并不卡。。。非常流畅。

我说的 CDN 的抽风大概是这个意思:因为 CDN 可能是在各个不同的地区,缓存或请求的策略有稍微不同,又或者是由于本地区的网络不稳定的原因,造成该地区在访问某些资源会出现一些不稳定的情况。

noikiy 回复 JellyBool

电信的网络 又在乱抽风 刚前几天我自己的搬瓦工 vps的vpn 也给弄不好用了 不知道在 干嘛的。一天到晚的;

JellyBool 回复 noikiy

现在嘛。。。到处都是特殊时期。

noikiy 回复 JellyBool

是的!
特殊时期!嘿嘿!

JellyBool 回复 noikiy

深圳就是超级戒严。。。

noikiy 回复 JellyBool

苦了亿万网名!

hate 回复 JellyBool

能问一个私人问题,如果让你个人选择你会选择上海还是深圳

JellyBool 回复 hate

深圳,气候OK,人比较年轻

Young

jelly ,用的{!!$question->body!!},为啥子我创建的问题自带标签属性,编辑的时候也带着,删除创建提交还是带标签,,类似于这样

<p>这是一段内容,知乎上在撕逼用vuejs的都是小白</p>
JellyBool 回复 Young

基本就是 ueditor 没有设置对吧

Young 回复 JellyBool

啊 我基本上解决,三颗颗油。。

2kpo

我想问下 method_field(‘PATCH’)的作用是什么?是因为资源路由question.update的method是PATCH所以一定要加上去吗?

JellyBool 回复 2kpo

恩,是的。浏览器原生是不支持的 PATCH ,我们通过表单字段来模拟 PATCH

dppppp

使用sync以后question_topic表的一条关联记录删除掉了 , 那么topics表里面被去掉关联的那个topic的questions_count是不是应该减一呢?

JellyBool 回复 dppppp

嗯,你可以直接操作一波

dppppp 回复 JellyBool

老师,想了半天,没想出来个招。question_topic表中一条记录删除的时候topic_id指向的那个topic的questions_count减一。
模型里面有什么方法可以在删除数据的时候触发呢?能给个提示吗?

JellyBool 回复 dppppp

Model Events ,我觉得可以使用这个

dppppp 回复 JellyBool

老师这个 5.3里面$events这个能用吗?我定义了怎么不好使呢

这是question_topic模型

class QuestionTopic extends Model
{
    protected $table = 'question_topic';

    protected $events = [
        'deleted' => QuestionTopicDeleteEvent::class,
    ];
}

这是EventServiceProvider

protected $listen = [
        'App\Events\QuestionTopicDeleteEvent' => [
            'App\Listeners\QuestionTopicDeleteListener',
        ],
    ];

这是QuestionTopicDeleteEvent

 public function __construct(QuestionTopic $question_topic)
    {
        $this->question_topic = $question_topic;
    }

这是QuestionTopicDeleteListener

public function handle(QuestionTopicDeleteEvent $event)
    {
        dump($event->question_topic->toArray());
        dd('正在执行删除操作');
    }

走不到打印的地方 不知道哪里错了

dppppp 回复 JellyBool

阿西。。。那还有什么高深的方法使用模型事件呢?

dppppp 回复 JellyBool

所以我写的下面一条回复的方法,算是直接监听吗?但是貌似sync方法并没有触发deleted或者deleting

dppppp

换了一种方式写:
在AppServiceProvider中

public function boot()
    {
        QuestionTopic::observe(QuestionTopicObserver::class);
    }

QuestionTopicObserver中

namespace App\Observers;

use App\QuestionTopic;
use App\Topic;

class QuestionTopicObserver
{
    public function deleting($question_topic){
        dd('删除了一条数据'.$question_topic->id);
        $topic = Topic::find($question_topic->topic_id)->decrement('questions_count');
    }
}

我用如下测试方法是会有打印的

Route::get('/test', function () {
    $question_topic = \App\QuestionTopic::find(15);
    $question_topic->deleted();
});

但是在$question->topics()->sync($topics);这种情况下,也会有删除对应数据的情况,可是不会触发,没有打印.

JellyBool 回复 dppppp

这么奇怪,sync 背后的源码难道没有触发 delete 方法。。。得看看源码

dppppp 回复 JellyBool

我找到一个大神的解答:如下

sync过程中确实是会有删除question_topic表的情况,不触发事件是因为在删除中间表的时候调用的是Builder这个类上面的delete方法,而不是QuestionTopic你这个模型上面的delete
这个和DB::table(‘question_topic’)->delete(1)不触发事件是同样的道理

JellyBool 回复 dppppp

嗯。所以还是要看源码。。。

carsonlius 回复 dppppp

那最后你是怎么解决的?

carsonlius 回复 dppppp

fico7489/laravel-pivot 可以解决问题

Zhijieyan

站长 topics相关 的css样式文件能贴出来吗?谢谢

JellyBool 回复 Zhijieyan

是这个站点的 css 么?

liujun

判断登录用户是否是问题的作者,可以用Auth::id()==$question->user_id吗?

JellyBool 回复 liujun

可以的啊,这个最直接了吧