![](/img/trans.png)
[英]how to insert into multiple table using eloquent or DB facade in laravel from a single form
[英]Laravel eloquent giving different results from DB facade
我有一個 laravel eloquent 查詢,它給我一個與使用DB
外觀的相同查詢不同的結果。 我無法理解為什么結果會有所不同。 結果集的長度相同( 6
),但是對於 eloquent 查詢,一個數據 object 鍵ha
保持不變(這是不正確的),而 DB 門面正確返回ha
鍵值。
Eloquent:
$add = FertilAppUser::join('farms', 'fertilappuser.farm_id', '=', 'farms.id')
->join('farm_blocks', 'farms.id', '=', 'farm_blocks.farm_id')
->crossJoin('crops', 'farm_blocks.crop_id', '=', 'crops.id')
->select('fertilappuser.block_id', 'fertilappuser.id', 'farm_blocks.hectares as ha')
->where('fertilappuser.farm_id', '=', 16)
->whereNotIn('fertilappuser.block_id', [6])
->groupBy('fertilappuser.id')
->get();
eloquent 查詢返回 6 個 object 項的集合,但ha
鍵保持不變:
Collection {
#items: array:6 [
0 => {
#original: array:3 [
"block_id" => 140
"id" => 7
"ha" => 2.5 // does not vary
]
}
1 => {
#original: array:3 [
"block_id" => 809
"id" => 66
"ha" => 2.5 // does not vary
]
}
2 => {
#original: array:3 [
"block_id" => 152
"id" => 67
"ha" => 2.5 // does not vary
]
}
3 => {
#original: array:3 [
"block_id" => 143
"id" => 68
"ha" => 2.5 // does not vary
]
}
4 => {
#original: array:3 [
"block_id" => 149
"id" => 69
"ha" => 2.5 // does not vary
]
}
5 => {
#original: array:3 [
"block_id" => 673
"id" => 70
"ha" => 2.5 // does not vary
]
}
]
}
DB門面:
$add = DB::select('SELECT fau.id id, fau.block_id, frm_b.hectares ha ' .
' FROM fertilappuser as fau ' .
' INNER JOIN farms AS f ' .
' ON (fau.farm_id = f.id) ' .
' INNER JOIN farm_blocks as frm_b CROSS JOIN crops c ' .
' ON (fau.block_id = frm_b.id AND frm_b.crop_id = c.id) ' .
' WHERE fau.farm_id = ? AND fau.block_id NOT IN (?) ' .
' GROUP BY fau.id ', [16, '6']);
DB
門面返回一個長度為 6 的數組,並且關聯的 object 鍵ha
值不同且正確。
array:6 [
0 => {#985
+"id": 7
+"block_id": 140
+"ha": 2.5 // correct
}
1 => {#983
+"id": 66
+"block_id": 809
+"ha": null // correct
}
2 => {#988
+"id": 67
+"block_id": 152
+"ha": null // correct
}
3 => {#1021
+"id": 68
+"block_id": 143
+"ha": 4.3 // correct
}
4 => {#1022
+"id": 69
+"block_id": 149
+"ha": 3.5
}
5 => {#1023
+"id": 70
+"block_id": 673
+"ha": 2.53 // correct
}
]
有誰知道為什么會有不同的結果? 我在 eloquent 查詢上的連接可能不正確嗎?
Laravel 5.6.39
您對 eloquent 的查詢將轉換為以下 SQL 代碼:
select
`fertilappuser`.`block_id`,
`fertilappuser`.`id`,
`farm_blocks`.`hectares` as `ha`
from
`fertilappuser`
inner join
`farms` on `fertilappuser`.`farm_id` = `farms`.`id`
inner join
`farm_blocks` on `farms`.`id` = `farm_blocks`.`farm_id`
cross join
`crops` on `farm_blocks`.`crop_id` = `crops`.`id`
where
`fertilappuser`.`farm_id` = ?
and
`fertilappuser`.`block_id` not in (?)
group by
`fertilappuser`.`id`
您的 SQL 在某些方面有所不同:
' INNER JOIN farm_blocks as frm_b CROSS JOIN crops c '.
'6'
而不是6
)現在,我不確定哪個查詢是正確的,但基本上不同的查詢意味着不同的結果。
只需使用控制台( php artisan tinker
)我就能夠生成以下查詢(不需要設置,因為我實際上並沒有訪問任何數據庫)
select
`fau`.`id` as `id`,
`fau`.`block_id`,
`frm_b`.`hectares` as `ha`
from
`fertilappuser` as `fau`
inner join
`farms` as `f` on (
`fau`.`farm_id` = `f`.`id`
)
inner join
`farm_blocks` as `frm_b`
cross join
`crops` as `c` on (
`fau`.`block_id` = `frm_b`.`id` and `frm_b`.`crop_id` = `c`.`id`
)
where `fau`.`farm_id` = ?
and `fau`.`block_id` not in (?)
group by `fau`.`id`
通過運行此代碼:
// You should be able to replace the first line by either
// DB::table('fertilappuser', 'fau')
// or FertilAppUser::from('fertilappuser', 'fau')
// to keep the alias
DB::connection('mysql')->table('fertilappuser', 'fau')
->select('fau.id as id', 'fau.block_id', 'frm_b.hectares as ha')
->join('farms as f', function ($join) {
return $join->on(['fau.farm_id' => 'f.id']);
})
->join('farm_blocks as frm_b', function ($join) {
return $join;
})
->crossJoin('crops as c', function ($join) {
return $join->on(['fau.block_id' => 'frm_b.id', 'frm_b.crop_id' => 'c.id']);
})
->where('fau.farm_id', 16)
->whereNotIn('fau.block_id', ['6']) // I still think this should be just 6
->groupBy('fau.id')
->toSql(); // replace with ->get(); to get the results
這里有一些奇怪的事情:
通常你會寫
$join->on(['fau.farm_id' => 'f.id'])
$join->on(['fau.block_id' => 'frm_b.id', 'frm_b.crop_id' => 'c.id'])
作為
$join->on('fau.farm_id', 'f.id')
$join->on('fau.block_id', 'frm_b.id')->on('frm_b.crop_id', 'c.id')
但是使用數組表示法告訴 eloquent 在它周圍放一對括號。 我不確定它是否真的有助於您的查詢,但我希望它完全相同。
on
的inner join
由於 Eloquent 強制您在使用join()
方法時添加條件,因此我只是傳遞了一個閉包並使其返回$join
本身而不添加任何內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.