laravel模型使用(一对一,一对多,多对多)

1 篇文章 0 订阅

创建模型

php artisan make:model Home/Article
<?php
// php artisan make:model Home/Article
namespace App\Home;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use App\User;

class Article extends Model
{
    use SoftDeletes;  //软删除  deleted_at timestamp类型
    protected $table = 'article'; //不定义table 默认对应的是 xxxs
    public $timestamps = false;  //默认会操作 created_at 和 updated_at 字段,表里面没有这两个字段的话要设置未false ,否则查询时会报错
    protected  $fillable=['id','category','title','content','status','sort','img','introduce','types','updated_at']; //可以填写的数据



//   关联作者模型 (一对一)
    /**
     *  public function 被关联的模型名小写,不一定要用表明(){
     *   return $this->>hasOne('需要关联模型的命名空间','被关联模型的字段','本模型的字段');
     * }
     */
    public function users(){
         return $this->hasOne(User::class,'id','user_id');
    }
    
    //    一对多
    public function comments(){
            return $this->hasMany(Comment::class,'article_id','id');
    }
    
    // 多对多
    //    return $this->belongsToMany('被关联模型的路径','多对多模型的关系表名','当前模型中的关系建','被关联的关系建');
    public function keywords()
    {
    
        return $this->belongsToMany(Keyword::class,'a_to_k_tmp','article_id','key_id');
    }

}

创建控制器

php artisan admin:make ArticeController --model=App\Home\Article    
<?php

namespace App\Admin\Controllers;

use App\Home\Article;
use Encore\Admin\Controllers\AdminController;
use Encore\Admin\Form;
use Encore\Admin\Grid;
use Encore\Admin\Layout\Content;
use Encore\Admin\Show;
use App\User;
use Illuminate\Support\Facades\DB;

//php artisan admin:make ArticeController --model=App\Home\Article     model是模板
class ArticleController extends AdminController
{
    /**
     * Title for current resource.
     *
     * @var string
     */
    protected $title = '文章';

    /**
     * Make a grid builder.
     *
     * @return Grid
     *默认情况下,表格的数据没有任何查询条件,可以使用model()方法来给当前表格数据添加查询条件:
        $grid->model()->where('id', '>', 100);

        $grid->model()->whereIn('id', [1, 2, 3]);

        $grid->model()->whereBetween('votes', [1, 100]);

        $grid->model()->whereColumn('updated_at', '>', 'created_at');

        $grid->model()->orderBy('id', 'desc');

        $grid->model()->take(100);
     */

    protected function grid()
    {
        $model = new Article();
//        $data = DB::table('article as a')->select('a.*','u.name')->join('users as u','a.user_id','=','u.id')->get(); //Db 联查
//        $data = $model->join('users as u','article.user_id','=','u.id')->select('article.*','u.name')->get();    //model  联查
//        foreach ($data as $key => $value){
//            echo $value->id ;
//            echo $value->name ;
//            echo '<br>';
//        }
        $data = $model->get();    //模型关联
      foreach ($data as $key => $value){
            echo $value->id ;
            echo $value->users->name ; //一对一

            foreach ($value->comments as $k => $v){
                dump($v->comment);  //一对多
            }
            
            foreach ($value->keywords as $k2 => $v2){
                dump($v2->keyword);  //多对多
            }
            
            echo '<br>';
        }
//        dump($data);exit;
        $grid = new Grid($model);
//        $grid->model()
//             ->join('users as u','article.user_id','=','u.id')
//             ->select('article.*','u.name');

        $grid->column('id', __('ID'));
        // 通过display(category)方法来格式化显示输出
        $grid->column('category', __('文章分类'))->display(function ($category){
            if($category == 1){
                return '系统公告';
            }else{
                return '其他';
            }
        });
//        $grid->column('user_id', __('作者'))->display(function ($user_id){
//            return DB::table('users')->where('id',$user_id)->value('name');
//        });
//        $grid->column('name', __('作者'));
        $grid->column('users.name', __('作者')); //模型关联
        $grid->column('title', __('标题'));

        $grid->column('content', __('内容'));
        $grid->column('status', __('状态'))->display(function ($status){
            if($status == 1){
                return '显示';
            }else{
                return '隐藏';
            }
        });
        $grid->column('created_at', __('生成时间'));
        $grid->column('status', __('状态'));
        $grid->column('sort', __('排序'));
        $grid->column('img', __('图片'));
        $grid->column('introduce', __('介绍'));
//        $grid->column('types', __('Types'));
        $grid->column('updated_at', __('跟新时间'));
        $grid->filter(function ($filter) {
//           设置created_at字段的范围查询   字段类型 timestamp 使用
//            $filter->between('created_at', 'Created Time')->datetime();
//            我用的是 int类型 所以需要自定义一个过滤器TimestampBetween
            $filter->use (new Grid\Filter\TimestampBetween('created_at', '生成时间'))->datetime();
        });

//      禁用创建按钮
//        $grid->disableCreateButton();

//      禁用分页条
//        $grid->disablePagination();

//      禁用查询过滤器
//        $grid->disableFilter();

//        禁用导出数据按钮
//        $grid->disableExport();

//        禁用行选择checkbox
//        $grid->disableRowSelector();

//        禁用行操作列
//        $grid->disableActions();



        // 默认为每页20条
//        $grid->paginate(15);

        $grid->perPages([10, 20, 30, 40, 50]);

        return $grid;
    }


    public function edit($id,Content $content){
        return $content->header('')
            ->description('')
            ->body($this->form()->edit($id));
    }


    /**
     * Make a show builder.
     *
     * @param mixed $id
     * @return Show
     */
    protected function detail($id)
    {
        $show = new Show(Article::findOrFail($id));

        $show->field('id', __('Id'));
        $show->field('category', __('文章分类'));
        $show->field('title', __('标题'));
        $show->field('content', __('内容'));
        $show->field('created_at', __('生成时间'));
        $show->field('status', __('状态'));
        $show->field('sort', __('排序'));
        $show->field('img', __('图片'));
        $show->field('introduce', __('介绍'));
//        $show->field('types', __('Types'));
        $show->field('updated_at', __('跟新时间'));

        return $show;
    }

    /**
     * Make a form builder.
     *
     * @return Form
     * @manual https://laravel-admin.org/docs/zh/model-form-validation
     * @course https://learnku.com/courses/laravel-package/2019/quickly-build-management-background-encorelaravel-admin/2356
     */
    protected function form()
    {
        $form = new Form(new Article());

        $form->switch('category', __('文章分类'));
        $form->text('title', __('标题'))
            ->placeholder('请输入标题内容')//输入提示
            ->rules('required|min:2', [
            'min'   => '标题不能少于2个字符',
            'required'   => '标题不能为空',
        ])//验证提示
        ;
        $form->textarea('content', __('内容'));
        $form->switch('status', __('状态'))->default(1);
        $form->number('sort', __('排序'));
        $form->image('img', __('图片'));
        $form->text('introduce', __('介绍'));
//        $form->switch('types', __('Types'));

        return $form;
    }



}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值