【问题标题】:Laravel Join query with LIKELaravel 使用 LIKE 加入查询
【发布时间】:2017-03-07 09:16:11
【问题描述】:
$toReturn['exams'] = exams_list::where('examAcYear',$this->panelInit->selectAcYear)
    ->join('classes', 'exams_list.examClasses', '=', 'classes.id')
    ->where('classes.classTeacher', 'LIKE', '%'.$this->data['users']->id.'%')
    ->select('classes.*','exams_list.exam_name')
    ->get()
    ->toArray(); 

这个查询正确吗?我必须加入 2 个表 classesexams_list,但没有得到任何值。

【问题讨论】:

  • 您能否提供您尝试加入的两个表的结构?您能否确认您的“类”和“exam_lists”是否有模型?
  • 是的,已定义具有此名称的模型。在表中,exams_list 字段“examClasses”的值以数组格式存储,例如:[“1”,“2”,“3”],在其他表 classes.id 是表“classes”的主键.

标签: php laravel join eloquent


【解决方案1】:

说明


我认为您的问题在于您的 join 子句的工作方式。

如果classes.id 的类型为(int),而exam_list.examClasses 的类型为(array)(json),那么您一开始就不太可能成功加入。您可以通过删除 where 子句并查看是否得到任何结果来对此进行测试。

解决方案


我建议将您的 classes 模型和 exam_list 模型之间的雄辩关系更改为与数据透视表的多对多关系或简单的一对多关系。

您需要自己决定哪个对您的项目最有意义!我强烈建议您阅读有关 eloquent 关系的文档,以更好地了解它们在这种情况下将如何帮助您。

https://laravel.com/docs/5.4/eloquent-relationships

示例


以下是您可能使用的多对多关系示例:

模型/类.php

/**
 * A class belongs to many exam lists
 *
 * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
 */
public function examLists()
{
    return $this->belongsToMany(Exam_list::class, 'classes_exam_lists');
}

模型/Exam_list.php

/**
 * A exam list has many classes
 *
 * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
 */
public function classes()
{
    return $this->belongsToMany(Classes::class, 'classes_exam_lists');
}

迁移

/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    Schema::create('classes_exam_lists', function (Blueprint $table) {
        $table->integer('class_id')->unsigned()->index();
        $table->foreign('class_id')->references('id')->on('classes')->onDelete('cascade');
        $table->integer('exam_list_id')->unsigned()->index();
        $table->foreign('exam_list_id')->references('id')->on('exam_lists')->onDelete('cascade');
        $table->primary(['class_id', 'exam_list_id']);
    });
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    Schema::drop('classes_exam_lists');
}

通过这些更改(并假设您的模型之间有可靠的关系),您可以使用 eloquent 通过执行以下操作来获取您需要的信息:

$exam_list = Exam_list::where('examAcYear',$this->panelInit->selectAcYear);

$collection = $exam_list->classes()->where('classTeacher', $this->data['users']->id)->get();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-05
    • 2019-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-13
    相关资源
    最近更新 更多