2016-05-01 89 views
1

我有QuestionAnswer模型。 问题有很多答案。在php artisan tinker模式下运行下面的命令调用数据库查询无明显原因:如何在不执行数据库查询的情况下创建新记录?

$q = new Question; 
$q->answers[] = new Answer; // invokes the below query 

// the executed query 
select * from `answers` where `answers`.`question_id` is null and `answers`.`question_id` is not null 

正如你看到的,没有必要对数据库调用任何。我怎样才能防止它?

+0

你可以查看是否'$ Q->答案() - >保存($答案)鉴于$答案已创建'运行SELECT查询? – ThePurpleK

+0

@ThePurpleK对不起,但我不明白你的意思。查询运行是因为'$ q-> answers'的用法,正如Joel的回答指出的那样, –

+0

我假设你的意图是将一个新的Answers记录与一个Question记录关联起来。我想知道我给出的代码是否会阻止不需要的数据库调用。 – ThePurpleK

回答

1

这是因为你将它分配给Question对象。它想看看你是否添加了一个现存的记录参考。 所有Laravel Eloquent模型都包含属性的神奇方法,并且试图将它们用作临时数据存储是一个真的糟糕的主意,除非您已为此特定目的提前为其定义属性。

只需使用常规数组,然后在模型准备好之后将它们关联起来。在一个一对多的关系

文档:
https://laravel.com/docs/5.1/eloquent-relationships#one-to-many

+0

感谢您的回答,但我需要模拟关系。有什么方法可以使用'$ q-> answers'作为临时存储? –

+0

我从来没有这样做,所以我不能肯定地说。出于某种原因,'$ model-> exists'是一个公共财产。您可以尝试模仿属性(包括一对多关系模型),并强制“存在”为“TRUE”,以查看是否可以欺骗Laravel不执行检查。 – Josh

3

当你这样做$q->answers,Laravel尝试加载所有的问题对象的答案 - 无论它们是否存在与否。

您访问模型实例的关系任何时候,你可以这样调用它answers()并获得查询生成器回来,或者你可以这样调用它answers不加括号Laravel将根据关系获取一个集合你。

你可以这样做防止它容易:

$q = new Question; 
$a = new Answer; 

然后,当你准备保存它们,将它们互相关联。在最简单的形式,看起来像这样:

$q->save(); 
$q->answers()->save($answer); 
+0

感谢您的回答,但我需要模拟这种关系。有什么方法可以使用'$ q-> answers'作为临时存储? –

相关问题