2016-05-01 90 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'作爲臨時存儲? –

相關問題