zerochip / laravel-lineage
一个用于链式调用 Eloquent 关系的 Laravel 扩展包
v1.0
2018-12-14 11:53 UTC
This package is auto-updated.
Last update: 2024-09-15 01:32:43 UTC
README
这是一个用于链式调用 Laravel 关系的扩展包。某些关系返回集合,因此无法进行链式调用。此扩展包提供了一种解决方案。
安装
使用 composer 安装
composer require zerochip/laravel-lineage
将 ServiceProvider 添加到 config/app.php 文件中的 providers 数组
'providers' => [ // Other Service Providers Zerochip\LineageServiceProvider::class, ];
快速入门
将 lineage 特性添加到你的模型中
<?php namespace App; use Illuminate\Database\Eloquent\Model; use Zerochip\Lineage\LineageTrait class Subject extends Model { use LineageTrait; }
例如,获取某个科目的测验。
没有 lineage,我们可能需要这样做
$subject = Subject::find(1); $quizzes = []; foreach ($subject->courses as $course) { foreach ($course->chapters as $chapter) { foreach($chapter->topics as $topic) { foreach($topic->sections as $section) { $quizzes = $quizzes->merge($section->quizzes); } } } }
使用 Laravel-Lineage,我们只需这样做
$subject = Subject::find(1); $quizzes = $subject->lineage('courses->chapters->topics->sections->quizzes');
您还可以获取集合的 lineage。
$subjects = Subject::get(); $quizzes = $subjects->lineage('courses->chapters->topics->sections->quizzes');
我们甚至可以获取其逆关系
$quiz = Quiz::find(1); $subject = $quiz->lineage('section->topic->chapter->course->subject')->first();
注意:lineage 总是返回一个集合,因此在上面的例子中使用了 first
Lineage 格式
Lineage 格式规则如下
-
使用分隔符
->。 -
应为字符串
$subject->lineage('course->chapters'); // the following won't work $subject->lineage(course->chapters);
-
应至少有 2 个级别
$subject->lineage('course->chapters'); // the following will cause an error $subject->lineage('course');
-
如果愿意,可以以
->开头$subject->lineage('course->chapters'); // produces the same result as above $subject->lineage('->course->chapters');
-
不能是开放的
$subject->lineage('course->chapters'); // the following will cause an error $subject->lineage('course->chapters->');
无 trait 和集合宏的使用方法
可以直接使用 lineage 类。此类有一个静态方法 get(),它接受对象(模型或集合)作为第一个参数,lineage 作为第二个参数。
use Zerochip\Lineage; $subject = Subject::find(1); $topics = Lineage::get($subject, 'course->chapters->topics'); // The same with a collection $courses = Courses::get(); $sections = Lineage::get($courses, 'chapters->topics->sections');