ใน Laravel ถ้าฉันทำการค้นหา:
$foods = Food::where(...)->get();
... จากนั้นก็$foods
คือคอลเลกชัน IlluminateของFood
วัตถุแบบจำลอง (โดยพื้นฐานแล้วคืออาร์เรย์ของโมเดล)
อย่างไรก็ตามคีย์ของอาร์เรย์นี้มีเพียง:
[0, 1, 2, 3, ...]
... ดังนั้นถ้าฉันต้องการแก้ไขพูดว่าFood
วัตถุที่มีid
24 ฉันไม่สามารถทำได้:
$desired_object = $foods->get(24);
$desired_object->color = 'Green';
$desired_object->save();
... เพราะนี่จะเป็นเพียงการเปลี่ยนแปลงองค์ประกอบที่ 25 ในอาร์เรย์ไม่ใช่องค์ประกอบที่มีid
24
ฉันจะรับองค์ประกอบเดียว (หรือหลายรายการ) จากคอลเลกชันโดยแอตทริบิวต์ / คอลัมน์ใดก็ได้ (เช่น แต่ไม่ จำกัด เฉพาะ id / color / age / ฯลฯ )
แน่นอนฉันสามารถทำได้:
foreach ($foods as $food) {
if ($food->id == 24) {
$desired_object = $food;
break;
}
}
$desired_object->color = 'Green';
$desired_object->save();
... แต่นั่นเป็นเพียงขั้นต้น
และแน่นอนฉันสามารถทำได้:
$desired_object = Food::find(24);
$desired_object->color = 'Green';
$desired_object->save();
... แต่นั่นยิ่งแย่กว่าเดิมเพราะมันทำการสืบค้นเพิ่มเติมที่ไม่จำเป็นเมื่อฉันมีวัตถุที่ต้องการใน$foods
คอลเลกชันแล้ว
ขอบคุณล่วงหน้าสำหรับคำแนะนำใด ๆ
แก้ไข:
เพื่อความชัดเจนคุณสามารถเรียก->find()
ใช้ Illuminate Collection ได้โดยไม่ต้องสร้างคำถามอื่น แต่ยอมรับเฉพาะ ID หลักเท่านั้น ตัวอย่างเช่น:
$foods = Food::all();
$desired_food = $foods->find(21); // Grab the food with an ID of 21
อย่างไรก็ตามยังไม่มีวิธีที่สะอาด (ไม่วนซ้ำไม่ใช่การสืบค้น) ในการจับองค์ประกอบโดยแอตทริบิวต์จากคอลเล็กชันเช่นนี้:
$foods = Food::all();
$green_foods = $foods->where('color', 'green'); // This won't work. :(