laravel 我想为雄辩的关系拉腊维尔

5kgi1eie  于 2023-01-18  发布在  其他
关注(0)|答案(2)|浏览(155)

在课程模型中包含此关系

public function course_modules()
    {
        return $this->hasMany(CourseModule::class, 'course_id');
    }

    public function course_lessons()
    {
        return $this->hasMany(CourseLesson::class, 'course_id');
    }

    public function course_contents()
    {
        return $this->hasMany(CourseContent::class, 'course_id');
    }

我想为hasMany关系创建一个数组,如

$hasMany=[
    CourseModule::class,
    CourseLesson::class
]
blmhpbnm

blmhpbnm1#

我想这样做的乐趣,原来相当困难,但在这里,有一些要求,你需要确保,但它得到的工作完成,我将使用PHP和Laravel的组合来完成这一点。

**第1步:确保你的主类有正确的返回方法类型。**在你的例子中也是如此。

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;

class Course extends Model
{    
    public function course_modules() : HasMany
    {
        return $this->hasMany(CourseModule::class, 'course_id');
    }

    public function course_lessons() : HasMany
    {
        return $this->hasMany(CourseLesson::class, 'course_id');
    }

    public function course_contents() : HasMany
    {
        return $this->hasMany(CourseContent::class, 'course_id');
    }
}

第2步:在控制器中,您需要使用ReflectionClass,希望有人能够出于学习目的改进此功能。

<?php

namespace App\Http\Controllers;

use ReflectionClass;

class CourseController extends Controller
{
    public function test(){
        //We will build a hasMany array
        $hasMany = [];
        
        //here we will use ReflectionClass on our primary class that we want to use.
        $reflection = new ReflectionClass(new \App\Models\Course);
        
        //Lets loop thru the methods available (300+ i don't like this part)
        foreach($reflection->getMethods() as $method){
            
            //if the method return type is HasMany
            if($method->getReturnType() != null && $method->getReturnType()->getName() == 'Illuminate\Database\Eloquent\Relations\HasMany'){
                //we grab the method name
                $methodName = $method->getName();
                //then we finally check for the relatedClass name and add to the array
                array_push($hasMany, get_class(($instance = new Course)->$methodName()->getRelated()));
            }
        }
        
        //lets dump to see the results
        dd($hasMany);
    }

结果:类的数组:D

array:2 [▼ 
  0 => "App\Models\ProgramTest",
  1 => "App\Models\ProgramAnotherTest"
]
dohp0rv5

dohp0rv52#

根据语法,我们不能在Laravel中这样做。但是,你可以使用一个模型的mutors来解决这个问题。

public function getCourseDetailsAttribute(){
  $arr=[
     "course_modules"=>$this->course_modules(),
     "course_lessions"=>$this->course_lessons(),
  ];
  return $arr;
}

在控制器中,您可以这样编写,
$课程=课程::查找(1)-〉课程详细信息;
更多详情请参见t;https://laravel.com/docs/5.7/eloquent-mutators

相关问题