Laravel 的关联模型 及其 预加载with应用

预加载 关联模型 和 TP 一样 都是用with model 关联定义 大同小异

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Book extends Model
{
    /**
     * 获取书籍作者。
     */
    public function author()
    {
        return $this->belongsTo('App\Author');
    }
}


//控制器
$books = App\Book::with('author')->get();

foreach ($books as $book) {
    echo $book->author->name;
}

预加载多个关联 有时,你可能需要在单一操作中预加载几个不同的关联。要达成此目的,只要向 with 方法传递多个关联名称构成的数组参数:

$books = App\Book::with(['author', 'publisher'])->get();

嵌套预加载 可以使用 「点」 语法预加载嵌套关联。比如在一个 Eloquent 语句中预加载所有书籍作者及其联系方式:

$books = App\Book::with('author.contacts')->get();

预加载指定列 并不是总需要获取关系的每一列。在这种情况下,Eloquent 允许你为关联指定想要获取的列:

$users = App\Book::with('author:id,name')->get();

注意:在使用这个特性时,一定要在要获取的列的列表中包含 id 列。

为预加载添加约束 有时,可能希望预加载一个关联,同时为预加载查询添加额外查询条件,就像下面的例子:

$users = App\User::with(['posts' => function ($query) {
    $query->where('title', 'like', '%first%');
}])->get();

在这个例子中, Eloquent 将仅预加载那些 title 列包含 first 关键词的文章。也可以调用其它的 查询构造器 方法进一步自定义预加载操作:

$users = App\User::with(['posts' => function ($query) {
    $query->orderBy('created_at', 'desc');
}])->get();

注意:在约束预加载时,不能使用 limit 和 take 查询构造器方法。

以上来自官方文档

具体使用

model中定义方法(user)
 public function getRole(){
        $data = $this->hasOne(Roles::class,"id(role中的id)","rolle_id(user中的)");
        return $data;
    }
    其他地方使用这个方法
    Users::with('getRole:id,name')->get(['name','role_id'])->toArray();
    //with里面对于role表而言,get对于users
Laravel 中预加载指定查询字段
直接上代码

$result = User::with('topics:user_id,body,title')
    ->where('name', 'Summer')
    ->get()
    ->toArray();


如果要进行约束预加载,应该这样写。

$result = User::with(['topics' => function ($query) {
    $query->select('id', 'user_id', 'body', 'title')
        ->orderBy('updated_at', 'desc');
    }])
    ->where('name', 'Summer')
    ->get()
    ->toArray();

在使用预加载时,表的关联字段一定要查询,否则查询后的数据没法匹配

另附 laravel 和 tp的 一些差异

1.0 Laravel 在表单提交的时候会有csrf 跨站请求伪造验证,Tp5则没有。

2.0 Laravel 在请求需要先定义路由,Tp5可以不定义,有pathinfo路由即可访问。

3.0 Laravel 在请求之前会有中间件, Tp5会有前置操作和钩子。

记录你我
请先登录后发表评论
  • latest comments
  • 总共0条评论