我正在尝试在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);
,但无法正常工作。有人可以建议我如何在这种情况下执行。
谢谢。
答案 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);