這給一試:
// Tree.php
public function perchBird($birdId)
{
$perched = $this->birds->pluck('id')->toArray();
$perched = array_combine($perched, array_fill(0, count($perched), ['index' => DB::raw('`index`+1')]));
$perched[$birdId] = ['index' => 1];
$this->birds()->sync($perched);
}
其分解:
1)獲取已經棲息鳥類的IDS
$perched = $this->birds->pluck('id')->toArray();
2)創建棲息鳥類的關聯數組IDS作爲鍵和更新語句作爲值,使用DB::raw
,以便Laravel瞭解它是MySQL計算,而不是本身的值。這樣我們就可以採用現有的索引並增加它。
$perched = array_combine($perched, array_fill(0, count($perched), ['index' => DB::raw('`index`+1')]));
3)將新棲息鳥添加到數組中,索引爲1。
$perched[$birdId] = ['index' => 1];
4)觸發數據透視表同步
$this->birds()->sync($perched);
值得一提的是,sync
方法單獨運行的每個更新語句,它可以根據棲息的鳥,你希望有數字高得驚人或者更新頻率。另一種方法是,爲增加索引做一個原始查詢,然後又對棲息一個新的鳥:
public function perchBird($birdId)
{
DB::update('update bird_tree set `index` = (`index`+1) where tree_id = ?', [$this->id]);
$this->birds()->attach($birdId, ['index' => 1]);
}
不完全是口若懸河,按照要求,但仍然相當簡單和可讀性。
10x抱歉關於延遲我會盡快在我測試解決方案時批准答案+1 –