Laravel 实战开发知乎:实现选择话题整个流程

Laravel 实战开发知乎:实现选择话题整个流程 QQ群:595928952 上一节 下一节

Laravel Vuejs 实战:开发知乎 >> Laravel 实战开发知乎:实现选择话题整个流程 视频发布于 2016-12-21

在前面的视频基础之上,这节视频来实现问题和话题的多对多关系,在前端表现就是实现选择话题的整个流程,后端表现为使用 laravel 的多对多关系实现关联
wenjie_zheng

如果用户的自定义话题填写的是 数字 怎么来判断?通过去查询数据库来判断?

JellyBool 回复 @wenjie_zheng

你可以把所有 topics id 拿出来,再判断一下有没有这个数字就行

wenjie_zheng 回复 @JellyBool

好主意,,,

zddragon 回复 @JellyBool

Laravel 实战开发知乎,这个系列视频大概有多少节?

JellyBool 回复 @zddragon

应该很多,36节以上吧。。不过过年前打算更完

zddragon 回复 @JellyBool

现在不能单独订阅这个系列的视频吗?

JellyBool 回复 @zddragon

恩,单独的已经关闭很久了

hao0661

代码的颜色很舒服,能分享一下吗?

laravistpublic

获取特定资源的关联模型的话我觉得这样写更好点:

$question = Question::with('topics')->findOrFail($id);
JellyBool 回复 @laravistpublic

好的,我学习一个

xshaitt 回复 @JellyBool
$question = Question::findOrFail($id);

您好请问这样写和上面有什么差别么?
最终在view里还是一样输出

JellyBool 回复 @xshaitt

findOrFail 没找到的时候会抛出 ModelNotFoundException

xshaitt 回复 @JellyBool

我的意思是加with和不加with,好像没差别额,在view中还是会调用topics关系

JellyBool 回复 @xshaitt

额。。不太明白你的意思,不是会,是可以吧

你传入一个数据库不存在的 id 试试就知道了

xshaitt 回复 @JellyBool

findOrFail这个我是理解的,我是这两段代码

$question = Question::with('topics')->findOrFail($id);
$question = Question::findOrFail($id);

都是返回一个Collection,但是加with的Colletion中的relations是有关联数据的,没加的是没有的,但是在view中都是这样调用

$question->topics

因为加和没加都是正常实现功能的,
so,我对这个不太理解,加这个with的作用是什么
我这样描述会不会清晰点

JellyBool 回复 @xshaitt

with 是懒加载,提前把数据查找出来了,不会出现 n+1 的问题

没有使用 with 的时候,你也可以使用 question->topic 只不过这是执行一次查询

hard88

你好,我在添加了$question->topics()->attach($topics);语句后报错:
QueryException in Connection.php line 770:
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'question_id' in 'field list' (SQL: insert into question_topic (created_at, question_id, topic_id, updated_at) values (2017-02-27 20:03:20, 7, 13, 2017-02-27 20:03:20), (2017-02-27 20:03:20, 7, 2, 2017-02-27 20:03:20))

JellyBool 回复 @hard88

你的关联表 question_topic 没有 question_id 这个字段吧,跟视频来吧

hard88 回复 @JellyBool

有。。我还重新生成了一遍这个表,刚又检查了一遍发现question_id这个字段 写成了queistion_id。。这种问题真的,麻烦了

lg23

http://www.zt.com/questions/2
浏览器输入上面内容时,出现下面报错:
Call to undefined relationship [topics] on model [App\Models\Question].
检查控制器及model没发现问题
Question model

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Question extends Model
{
    protected $fillable = ['title', 'body', 'user_id'];

    /**
     * 定义多对多关系
     */
    public function topics()
    {
        return $this->belogsToMany(Topic::class)->withTimestamps();
    }
}

QuestionsController 控制器

public function show($id)
    {
        // 使用 with 方法指定想要预载入的关联对象 预载入可以大大提高程序的性能
        // 这里的 topics 是App\Models\Question 中的 topics 的方法
        $question = Question::where('id',$id)->with('topics')->get();

        // compact 创建一个包含变量名和它们的值的数组
        return view('questions.show',compact('question'));
    }
JellyBool 回复 @lg23

看不出有什么错误。。。
试试这样?

Question::with('topics')->where('id',$id)

所以你还是照你的想法来学?

lg23 回复 @JellyBool

Question::where('id',$id)->first();
这 样是没有问题的
其实很多东西我都学过,只是理解不深刻或是没记住。我会抓紧时间看群主的视频,比我以前学习的例子好很多。

lg23 回复 @JellyBool
public function topics()
    {
        return $this->belongsToMany('App\Models\Topic')->withTimestamps();
    }

这里有问题,我至于具体是哪?我也不知道,我从文档中复制了这句就对了?
当然 Topic::calss 也是正确的

hmengpang 回复 @lg23

model的namespace错了。。。应该是App\,

hmengpang

已解决。。是自己犯傻。。不好意思。。

tophgg

大佬,问一下 跟着视频步骤做点击“提交” 在show方法里输出dd($request->get('topics'));
可是我自从加了话题之后,点击“提交”之后只会在原页面刷新了一次,跳转不到show方法里面去
然后我试了下把

 public function store(StoreQuestionRequest $request) // 依赖注入

里的StoreQuestionRequest改回Request之后 又可以跳转了,没加话题之前是可以正常提交的 这是什么原因呢? 是我漏改了吗

JellyBool 回复 @tophgg

StoreQuestionRequest 里面的 rules 验证没通过,或者你的 authorized 方面没改对

tophgg 回复 @JellyBool

试了一下,原来rules返回的数组里最后多了个逗号就会这样 去掉之后ok了 谢啦

xiaofengzhi

谁有那个class = topic的css样式?

北漂张小白
public function normalizeTopic(array $topics)
{

    return collect($topics)->map(function ($topic) {
        if ( is_numeric($topic) ) {
            Topic::find($topic)->increment('questions_count');
            return (int) $topic;
        }
        $newTopic = Topic::create(['name' => $topic, 'questions_count' => 1]);
        return $newTopic->id;
    })->toArray();
}


这个是什么意思,不太明白,主要是collect($topics)->map...是什么作用不太理解,之前有在哪里讲到吗??
JellyBool 回复 @北漂张小白

你看看 colletion 重构代码那个系列

北漂张小白 回复 @JellyBool

好的,谢谢!!

JellyBool 微信公众号

不定期送书,送键盘,送订阅优惠