簡體   English   中英

從另一個收藏創建一個新收藏

[英]Creating a new collection from another collection

即時通訊從我進行的查詢中創建特定數據的集合,但是我需要使用僅包含具有自定義名稱屬性的某些數據來創建一個新集合,我正在使用數組,但是由於要更容易格式化,因此我需要在集合中進行創建數據並訪問某些收集方法。

我當前的代碼是這樣的:

    $activity = [];
            $temp = [];

$calculations = collect($user->calculations()
            ->withTrashed()
            ->orderBy('updated_at', 'desc')
            ->get());

        foreach($calculations as $calculation){
            $temp['type'] = "calculation";
            $temp['name'] = $calculation->name;
            $user = $this->getUserById($calculation->pivot->user_id);
            $temp['user'] = $user->name ." ".$user->surname;



            if($calculation->created_at == $calculation->updated_at && $calculation->deleted_at == null)
            {
                $temp['operation'] = "saved";
                $temp['date'] = $calculation->created_at;
                $temp['diff'] =  Carbon::parse($calculation->created_at)->diffForHumans();
            }elseif($calculation->created_at != $calculation->updated_at && $calculation->deleted_at != null)
            {

                $temp['operation'] = "changed";
                $temp['date'] = $calculation->updated_at;
                $temp['diff'] =  Carbon::parse($calculation->updated_at)->diffForHumans();

            }else{
                $temp['operation'] = "delete";
                $temp['date'] = $calculation->deleted_at;
                $temp['diff'] =  Carbon::parse($calculation->deleted_at)->diffForHumans();
            }


           array_push($activity,$temp);


        }
     $conditions = collect($user->conditions()
                ->withTrashed()
                ->orderBy('updated_at', 'desc')
                ->get());


            foreach($conditions as $condition){
                $temp['type'] = "condition";
                $temp['name'] = $condition->name;
                $user = $this->getUserById($condition->user_id);
                $temp['user'] = $user->name ." ".$user->surname;

                if($condition->created_at == $condition->updated_at && $condition->deleted_at == null)
                {
                    $temp['operation'] = "saved";
                    $temp['date'] = $condition->created_at;
                    $temp['diff'] =  Carbon::parse($condition->created_at)->diffForHumans();
                }elseif($condition->created_at != $condition->updated_at && $condition->deleted_at != null)
                {

                    $temp['operation'] = "alterado";
                    $temp['date'] = $condition->updated_at;
                    $temp['diff'] =  Carbon::parse($condition->updated_at)->diffForHumans();

                }else{
                    $temp['operation'] = "delete it";
                    $temp['date'] = $condition->deleted_at;
                    $temp['diff'] =  Carbon::parse($condition->deleted_at)->diffForHumans();
                }

                array_push($activity,$temp);

我已經將雄辯的查詢轉換為“收集”,但是我如何無法創建新的收集,我需要改為使用數組方法,而應該使用收集方法來創建它們。

基本上,我的主要原因是我需要合並“條件”和“計算”,以便能夠對集合中的dataTime進行排序。

這樣的事情怎么樣。

我在集合上使用了transform方法(以轉換鍵名)。 我已經復制了您的邏輯,然后合並了兩個集合。

$calculations = $user->calculations()
        ->withTrashed()
        ->orderBy('updated_at', 'desc')
        ->get();

$transformed = $calculations->transform(function($item, $key) use($user) {
        $toReturn = [];
        $toReturn['type'] = "calculation";
        $toReturn['name'] = $item->name;
        $toReturn['user'] = $user->name;

        if($item->created_at == $item->updated_at && $item->deleted_at == null) {
            $toReturn['operation'] = "saved";
            $toReturn['date'] = $item->created_at;
            $toReturn['diff'] =  Carbon::parse($item->created_at)->diffForHumans();
        } elseif($item->created_at != $item->updated_at && $item->deleted_at != null){
            $toReturn['operation'] = "changed";
            $toReturn['date'] = $item->updated_at;
            $toReturn['diff'] =  Carbon::parse($item->updated_at)->diffForHumans();

        } else {
            $toReturn['operation'] = "delete";
            $toReturn['date'] = $item->deleted_at;
            $toReturn['diff'] =  Carbon::parse($item->deleted_at)->diffForHumans();
        }
        return $toReturn;
    });

 $conditions = $user->conditions()
            ->withTrashed()
            ->orderBy('updated_at', 'desc')
            ->get();

$transformed2 = $conditions->transform(function($item, $key) use($user) {
        $toReturn = [];
        $toReturn['type'] = "calculation";
        $toReturn['name'] = $item->name;
        $toReturn['user'] = $this->getUserById($item->user_id);

        if($item->created_at == $item->updated_at && $item->deleted_at == null) {
            $toReturn['operation'] = "saved";
            $toReturn['date'] = $item->created_at;
            $toReturn['diff'] =  Carbon::parse($item->created_at)->diffForHumans();
        } elseif($condition->created_at != $condition->updated_at && $condition->deleted_at != null){
            $toReturn['operation'] = "changed";
            $toReturn['date'] = $item->updated_at;
            $toReturn['diff'] =  Carbon::parse($item->updated_at)->diffForHumans();

        } else {
            $toReturn['operation'] = "delete";
            $toReturn['date'] = $item->deleted_at;
            $toReturn['diff'] =  Carbon::parse($item->deleted_at)->diffForHumans();
        }
        return $toReturn
    });

$merged = $transform->merge($transform2);

在@devk的答案上構建的是一個更整潔的版本,沒有太多重復的代碼:

/**
 * Transform a collction with a given callback
 *
 * @param   Collection   $collection     A laravel collection
 * @param   User         $user           A User object
 * @return  Collection
 **/
private function transformCollection(Collect $collection, User $user) {
    return $collection->transform(function($item, $key) use ($user) {
        $toReturn = [
            'type' => 'calculation',
            'name' => $item->name,
            'user' => $user->name
        ];

        if ($item->created_at == $item->updated_at && $item->deleted_at == null) {
            $toReturn['operation']  = "saved";
            $toReturn['date']       = $item->created_at;
            $toReturn['diff']       = Carbon::parse($item->created_at)->diffForHumans();
        } elseif ($item->created_at != $item->updated_at && $item->deleted_at != null) {
            $toReturn['operation']  = "changed";
            $toReturn['date']       = $item->updated_at;
            $toReturn['diff']       = Carbon::parse($item->updated_at)->diffForHumans();
        } else {
            $toReturn['operation']  = "delete";
            $toReturn['date']       = $item->deleted_at;
            $toReturn['diff']       = Carbon::parse($item->deleted_at)->diffForHumans();
        }

        return $toReturn;
    });
}

// Return all user calculations ordered by when they were updated including deleted
$calculations   = $user->calculations()->withTrashed()->orderBy('updated_at', 'desc')->get();
$conditions     = $user->conditions()->withTrashed()->orderBy('updated_at', 'desc')->get();

// Transform both collections
$transformed    = transformCollection($calculations, $user);
$transformed2   = transformCollection($conditions, $user);

// Merge the resulting collections into a single collection
$merged = $transform->merge($transform2);

編輯

如果您的Calculation對象具有模型,則還可以通過將日期添加到protected $dates = []數組中來確保將日期作為Carbon日期返回

protected $dates = [
    'deleted_at',
    'created_at',
    'updated_at'
];

我認為created_atupdated_at默認情況下作為BaseModel一部分包含在BaseModel ,以為我很可能是錯誤的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM