【问题标题】:Laravel: Order hasManyThroughLaravel:订购 hasManyThrough
【发布时间】:2021-08-30 09:39:45
【问题描述】:

我很难理解 laravel 中的“hasManyThrough”概念。 我得到了类似于这些表的东西:

project
- id

project_document
- id
- project_id

project_document_order
- id
- project_document_id

在项目模型中我有这些关系:

public function projectDocuments(){
    return $this->hasMany(
        ProjectDocuments::class,
        'project_id'
    );
}

public function projectDocumentOrder(){
    return $this->hasManyThrough(
        ProjectDocumentOrder::class,
        ProjectDocuments::class,
        'project_id',
        'project_document_id'
    );
}



Project::where( 'id', $pid )->with( 'projectDocuments', 'projectDocumentOrder' )->firstOrFail();

这会导致一个项目包含多个 projectDocuments 和多个 projectDocumentOrder。

结果:

#original: array:14 [▼]
"id" => 1
"uuid" => [UUID]
"author" => 1
"project_name" => [NAME]

#relations: array:2 [▼]
"projectDocuments" => Illuminate\Database\Eloquent\Collection {#1352 ▼
    #items: array:5 [▼
        0 => App\Models\projectDocuments {#1368 ▼
            #original: array:10 [▼
                "id" => 1
                "user_id" => 471
                "project_id" => 1
        }
        1 => App\Models\projectDocuments {#1368 ▼
            #original: array:10 [▼
                "id" => 2
                "user_id" => 252
                "project_id" => 1
        }
        2 => App\Models\projectDocuments {#1368 ▼
            #original: array:10 [▼
                "id" => 3
                "user_id" => 252
                "project_id" => 1
        }
        3 => App\Models\projectDocuments {#1368 ▼
            #original: array:10 [▼
                "id" => 4
                "user_id" => 471
                "project_id" => 1
        }
        4 => App\Models\projectDocuments {#1368 ▼
            #original: array:10 [▼
                "id" => 5
                "user_id" => 252
                "project_id" => 1
        }
    ]
}
"projectDocumentOrder" => Illuminate\Database\Eloquent\Collection {#1367 ▼
  #items: array:5 [▼
        0 => App\Models\projectDocumentOrder {#1368 ▼
            #original: array:10 [▼
                "id" => 1
                "project_documents_id" => 1
                "order" => 1
        }
        1 => App\Models\projectDocumentOrder {#1368 ▼
            #original: array:10 [▼
                "id" => 2
                "project_documents_id" => 1
                "order" => 2
        }
        2 => App\Models\projectDocumentOrder {#1368 ▼
            #original: array:10 [▼
                "id" => 3
                "project_documents_id" => 1
                "order" => 3
        }
        3 => App\Models\projectDocumentOrder {#1368 ▼
            #original: array:10 [▼
                "id" => 4
                "project_documents_id" => 1
                "order" => 5
        }
        4 => App\Models\projectDocumentOrder {#1368 ▼
            #original: array:10 [▼
                "id" => 5
                "project_documents_id" => 1
                "order" => 4
        }
    ]
}

现在我的问题:我将如何根据 projectDocumentOrder 中的 order 列对 projectDocuments 进行排序?

【问题讨论】:

    标签: laravel sorting eloquent laravel-8 eloquent-relationship


    【解决方案1】:

    我找到了适合我的解决方案。

    $project->projectDocumentOrder->sortBy( 'order' )->pluck('projectDocuments')->toJson()
    

    此解决方案确实需要一个 projectDocuments 函数将 ProjectDocumentOrder 链接到 ProjectDocumentOrder 模型中的 ProjectDocuments。

    【讨论】:

      【解决方案2】:

      首先我认为你只需要 with: 'projectDocumentOrder',因为 laravel 要获得 projectDocumentOrder,需要加入 projectDocuments。

      其次,你可以这样做:

      Project::where( 'id', $pid )->with(['projectDocuments'=>function($query){
         $query->leftJoin('table_name','local_key','operator','foreign_key');
         $query->orderBy('table_name.field','ASC|DESC');
      )
      }])->firstOrFail();
      

      【讨论】:

      • 虽然这确实有效,但我可能已经找到了更好的解决方案。 $project->projectDocumentOrder->sortBy( 'order' )->pluck('projectDocuments')->toJson() 此解决方案确实需要在 ProjectDocumentOrder 中将 projectDocuments 函数链接到 ProjectDocumentOrder 模型中的 ProjectDocuments。
      猜你喜欢
      • 2020-09-08
      • 1970-01-01
      • 2014-09-19
      • 2021-03-18
      • 1970-01-01
      • 1970-01-01
      • 2018-07-24
      • 2014-08-14
      • 2017-12-08
      相关资源
      最近更新 更多