[英]Laravel joins only appear when all the joined tables contain values
我有一個課程表和一個content_texts 、 content_files 、 content_videos和quizzes表。 所有表格都與課程表相關,具有一對多的關系,其中一個課程表有許多content_texts 、 content_files 、 content_videos和quizzes 。 問題是,當我填寫所有content_texts 、 content_files 、 content_videos和quizzes表並且我加入時會顯示所有這些表,但是當我只填寫一個時,我加入的所有表都不會顯示。
這是我的 CurriculumDisplayResource
<?php
namespace App\Http\Resources;
use App\Models\Curriculum;
use Illuminate\Http\Resources\Json\JsonResource;
use Illuminate\Support\Facades\DB;
class CurriculumDisplayResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'id' => $this->id,
'title_section' => json_decode($this->title_section),
'learning_objective'=> json_decode($this->learning_objective),
'content_detail' =>
DB::table('curriculums')
->join('content_texts','curriculums.id','=','content_texts.curriculum_id')
->join('content_files','curriculums.id','=','content_files.curriculum_id')
->join('content_videos','curriculums.id','=','content_videos.curriculum_id')
->join('quizzes','curriculums.id','=','quizzes.curriculum_id')
->select('content_texts.title_text','content_texts.text_course',
'content_files.title_file','content_files.file_course','content_videos.title_video',
'content_videos.video_course',"quizzes.title_quiz",'quizzes.question','quizzes.answer','quizzes.right_answer')
->get(),
'parent_id' => $this->id,
];
}
}
這是課程控制器
<?php
namespace App\Http\Controllers\Course;
use App\Http\Controllers\Controller;
use App\Http\Resources\CurriculumDisplayResource;
use App\Http\Resources\CurriculumResource;
use App\Models\ContentText;
use App\Models\Curriculum;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
class CurriculumController extends Controller
{
public function index()
{
// return CurriculumDisplayResource::collection(
// DB::table('curriculums')->join('courses','courses.id','=','curriculums.course_id')->select('curriculums.*')->get());
}
public function store (Request $request)
{
$c = new Curriculum();
$c->title_section = json_encode($request->get('title_section'));
$c->learning_objective = json_encode($request->get('learning_objective'));
$c->user_id = Auth::id();
$c->course_id = $request->get('course_id');
$c->save();
return response(new CurriculumDisplayResource($c));
}
public function show($id)
{
$curriculum = Curriculum::findOrFail($id);
return response($curriculum);
}
public function update(Request $request, $id)
{
$c = Curriculum::findOrFail($id);
$c->title_section = json_encode($request->get('title_section'));
$c->learning_objective = json_encode($request->get('learning_objective'));
$c->user_id = Auth::id();
$c->course_id = $request->get('course_id');
$c->save();
return response(new CurriculumResource($c));
}
public function destroy($id)
{
$c = Curriculum::findOrFail($id);
$c->delete();
return response(null,204);
}
}
要從表課程中獲取所有結果,無論它是否具有關系數據,您都可以使用左連接
無論是否存在關系數據,左連接都會從左“表”中獲取數據:
DB::table('curriculums')
->leftJoin('content_texts','curriculums.id','=','content_texts.curriculum_id')
->leftJoin('content_files','curriculums.id','=','content_files.curriculum_id')
->leftJoin('content_videos','curriculums.id','=','content_videos.curriculum_id')
->leftJoin('quizzes','curriculums.id','=','quizzes.curriculum_id')
->select('content_texts.title_text','content_texts.text_course',
'content_files.title_file','content_files.file_course','content_videos.title_video',
'content_videos.video_course',"quizzes.title_quiz",'quizzes.question','quizzes.answer','quizzes.right_answer')
->get(),
您可以使用 eloquent 中的關系以更結構化的方式獲取所有關系
$curriculums = Curriculum:::whit(['contentTexts', 'contentFils', 'contentVideos', 'quizzes'])->get();
其中'contentTexts', 'contentFils', 'contentVideos', 'quizzes'
是 class Curriculum
中聲明的關系的名稱
課程::class
public function contentText()
{
return $this->hasMany(ContentVideo::class);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.