在Laravel中的控制器中注入模型和返回值“具有”关系

时间:2019-03-05 07:37:13

标签: laravel laravel-5 laravel-5.7

我正在尝试在Laravel上构建应用程序,并且想知道在将模型注入控制器函数内部时是否可以使用with关系:

我有一个名为Stream的模型,也有一个名为Standard的模型。 Standard属于Stream,因此我的代码如下:

class Standard extends Model
{
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $guarded = [];

    public function stream()
    {
        return $this->belongsTo('Models\Stream', 'stream_id', 'id');
    }
}

现在在我的StandardController中,我使用以下函数来显示模型:

public function show(Standard $standard)
{
    return response()->json(['data' => $standard], 200);
}

我正在尝试使用return response()->json(['data' => $standard->with('stream')], 200);,但无法正常工作。有人可以建议我如何在这种情况下执行。

谢谢。

3 个答案:

答案 0 :(得分:3)

#include <iostream> #include <cstdlib> #include <time.h> #include <sys/time.h> using namespace std; const int MAX_LENGTH = 35; const int MAX_MONTH = 12; const int MAX_DAY = 31; const int MAX_YEAR = 100; void getName(char name []); void sayName(char name []); int getVoters(); int main() { int numVoters; char name[MAX_LENGTH]; // Variable that stores "Name" of user added max char to be 25 struct timeval tv; getName(name); sayName(name); numVoters = getVoters(); unsigned int seed = time(0); // gets current computer time gettimeofday(&tv,NULL); int day = 0; int month = 0; int year = 0; int voterNumber = 1; for (int i = numVoters;i > 0;i--) { seed = (unsigned int)((tv.tv_sec+tv.tv_usec)*i); month = rand_r(&seed)%MAX_MONTH + 1; day = rand_r(&seed)%MAX_DAY + 1; year = rand_r(&seed)%(MAX_YEAR+1) + 1900; cout<<"Voter #"<<voterNumber++<<" DD/MM/YYY DOB: "; cout<<day<<"/"<<month<<"/"<<year<<endl; } return 0; } void getName(char name[]) { cout<<"Please enter your first name: "; cin.getline(name,35); } void sayName(char name []) { cout<<"Hello "<<name<<endl; } int getVoters() { int voters = -1; cout<<"Please enter amount of voters: "; cin>>voters; if(voters < 0) { cout << "ERROR! ERROR! WRONG DATA TYPE PLEASE RUN THE PROGRAM AGAIN"; } else if(voters == 0) { cout<<"Either you entered 0 or an invalid date type"; } else { cout << "You entered: " << voters << endl; } return voters; } 用于最初获取模型的时间。如果您已有模型,则可以改用with()。这称为lazy eager loading

load()

答案 1 :(得分:1)

您在这里有几个选择:

1)您可以使用API Resources。这是我的首选方法。

2)如果“ API资源”不是您的最佳选择,则只需以某种方式加载关系。一种实现方法是$standard->load('stream')。另一种方法是仅访问该关系:$standard->stream

这里发生的是任何访问的关系都将其放入模型的relations键中,这使得默认的json序列化有点不可预测。因此,我更希望使用API​​资源。

3)您可以修改Standard模型的$with数组以包含stream,但是我不喜欢这种方法,因为这意味着每次Standard记录被提取后,它们将自动获取stream关系。

with()是您在Eloquent Builder对象上调用的一种方法,该对象将获取Eager Loading的关系。在这种情况下,您使用的是Model实例,而不是Eloquent Builder。

答案 2 :(得分:1)

请尝试以下代码。更详细的解释,请访问laravel docs

$standard->load('stream');
return response()->json(['data' => $standard], 200);