Laravel 5.8 做个知乎 7 ——话题 多对多的保存(collect方法 with方法等) 传统模式与Repository模式

1 传统模式

1.1 模板代码

\resources\views\questions\create.blade.php

<select  class="js-example-basic-multiple js-example-data-ajax form-control" name="topics[]" multiple="multiple">

</select>

1.2 控制器代码

\app\Http\Controllers\QuestionsController.php

    public function store(StoreQuestionRequest $request)
    {
        //自动过滤掉token值
        //$this->validate($request,$rules,$message);
        
        $topics = $this->normailizeTopic($request->get(‘topics‘));
        $data = $request->all();
        $save = [
            ‘title‘     =>$data[‘title‘],
            ‘body‘      =>$data[‘body‘],
            ‘user_id‘   =>Auth::id()
        ];
        $rs = Question::create($save);
    
        $rs->topics()->attach($topics);
        
        return redirect()->route(‘question.show‘,[$rs->id]);
    }
Laravel 5.8 做个知乎 7 ——话题 多对多的保存(collect方法 with方法等) 传统模式与Repository模式
    private function normailizeTopic(array $topics)
    {
        //collect 遍历方法
        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();
    }
View Code

1.3 模型

\app\Question.php

Laravel 5.8 做个知乎 7 ——话题 多对多的保存(collect方法 with方法等) 传统模式与Repository模式
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Question extends Model
{
    //fillable为白名单,表示该字段可被批量赋值;guarded为黑名单,表示该字段不可被批量赋值。
    protected $fillable = [‘title‘,‘body‘,‘user_id‘];
    
    public function isHidden()
    {
        return $this->is_hidden === ‘T‘;
    }
    
    public function topics()
    {
        //多对多的关系
        //belongsToMany如果第二个参数不是question_topic的话 可以通过第二个参数传递自定义表名
        return $this->belongsToMany(Topic::class,‘question_topic‘)
          ->withTimestamps();
    }
}
View Code

\app\Topic.php

Laravel 5.8 做个知乎 7 ——话题 多对多的保存(collect方法 with方法等) 传统模式与Repository模式
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Topic extends Model
{
    //
    protected $fillable = [‘name‘,‘questions_count‘];
    
    public function questions()
    {
        return $this->belongsToMany(Question::class)
          ->withTimestamps();
    }
    
}
View Code

1.4 保存后显示

\app\Http\Controllers\QuestionsController.php

    public function show($id)
    {
        //
        //$question = Question::find($id);
        $question = Question::where(‘id‘,$id)->with(‘topics‘)->first();
        return view(‘questions.show‘,compact(‘question‘));
    }

\resources\views\questions\show.blade.php

 @foreach($question->topics as $topic)
       <span class="topic">{{$topic->name}}</span>
 @endforeach

 

Laravel 5.8 做个知乎 7 ——话题 多对多的保存(collect方法 with方法等) 传统模式与Repository模式

上一篇:.NET Core 2.1中的HttpClientFactory最佳实践


下一篇:Linux 设备驱动 Edition 3