2017-05-06 34 views
7

Tôi là người mới ở số laravel, câu hỏi của tôi có thể lạ đối với một người nào đó. Vâng, câu hỏi của tôi là làm thế nào tôi có thể viết một thực thể trong Laravel Model lớp mà sẽ không được tạo ra bất kỳ lĩnh vực trong cơ sở dữ liệu sau khi di chuyển của tôi. Ví dụ:Làm thế nào để viết một thực thể NotMapped trong mô hình Laravel?

class JobseekerModel extends Model 
{ 
    use SoftDeletes; 
    protected $table='dbl_jobseekers'; 
    protected $primaryKey='id'; 
    protected $fillable=[ 
     'FirstName', 
     'MiddleName', 
     'LastName', 
     'Dob', 
     'Education', 
     'DesireField', 
     'Skill', 
     'SpecialSkill', 
     'Experience', 
     'Location', 
     'HomeAddress', 
     'Salary', 
     'Comenteries', 
     'Resume' 
    ]; 
    protected $dates = ['deleted_at']; 
} 

Đây là mẫu của tôi, bây giờ tôi muốn thêm một thuộc tính khác có tên 'PagedListSize' vào Mô hình của tôi, tuy nhiên tôi không muốn tạo nó làm cột cơ sở dữ liệu. Vì vậy, làm thế nào để tôi làm điều này?

Ví dụ tôi quen sử dụng NotMapped tài sản trong .Net Framework, được viết như

[NotMapped] 
public int PagedListSize {set; get;} 

Vì vậy, làm thế nào tôi có thể làm điều này. Có cách nào để làm điều này trong laravel? Tôi đang làm việc trên Laravel 5.4

+1

Bạn có thể cụ thể hơn không. Bạn có cần fieald mà nên được tính toán? Hoặc bạn cần tài sản đơn giản của một lớp học? – huuuk

+0

Vâng, tôi cần thuộc tính đơn giản của một lớp, mà không tạo cột trong cơ sở dữ liệu. Tuy nhiên, tôi có thể chuyển dữ liệu từ 'Controller' sang' view' và 'view' sang' Controller'.Tôi sẽ chỉ sử dụng tài sản này trong trường hợp của tôi một số mục đích tính toán. không có gì khác. – gdmanandamohon

+0

@ lazycoder trong câu hỏi của bạn, nơi bạn đã nói rằng bạn cần các thuộc tính được sắp xếp theo thứ tự? Bởi vì sự khác biệt duy nhất mà câu trả lời được chấp nhận có với tôi, đó là nó giải thích cách các thuộc tính có thể được tuần tự hóa khi chuyển đổi lớp thành dữ liệu json. –

Trả lời

0

Cách tốt nhất để làm điều này trong Laravel thực sự là thông qua custom Mutators. Ngoài ra, mutators có thể được cấu hình để được hiển thị trong json hoặc mảng output dump của mô hình. ví dụ. cho PagedListSize chúng ta có thể có:

public functionGetPagedListSizeAttribute() 
{ 
    return #some evaluation; 
} 

protected $appends = array('pagedListSize'); 

Bằng cách này, pagedListSize sẽ không chỉ được cung cấp trực tiếp như một lĩnh vực mà còn có sẵn bất cứ khi nào mô hình này là serialized như Json hoặc Array.

+0

Đó là những gì tôi mong đợi !!!!!! – gdmanandamohon

2

Bạn có thể thêm các thuộc tính được bảo vệ vào Mô hình Laravel, miễn là chúng không va chạm với tên trường. Bên cạnh đó, với Laravel, việc di chuyển quyết định cấu trúc DB, không phải là các mô hình, do đó bạn không có nguy cơ tạo các trường tự động (thực tế, các mô hình mặc định làm việc không có thuộc tính nào trong hộp).

EDIT: Ví dụ từ gói mặc định user.php

<?php 

namespace App; 

use Illuminate\Notifications\Notifiable; 
use Illuminate\Foundation\Auth\User as Authenticatable; 

class User extends Authenticatable 
{ 
    use Notifiable; 

    /** 
    * The attributes that are mass assignable. 
    * 
    * @var array 
    */ 
    protected $fillable = [ 
     'name', 'email', 'password', 
    ]; 

    /** 
    * The attributes that should be hidden for arrays. 
    * 
    * @var array 
    */ 
    protected $hidden = [ 
     'password', 'remember_token', 
    ]; 

    /** 
    * You can add some properties here 
    * will require getter and/or setters 
    * does not need to be fillable 
    */ 
    protected $someLogicalProperty; 

} 

Cấu trúc db thực tế được xác định trong di cư (2014_10_12_000000_create_users_table.php):

Schema::create('users', function (Blueprint $table) { 
    $table->increments('id'); 
    $table->string('name'); 
    $table->string('email')->unique(); 
    $table->string('password'); 
    $table->rememberToken(); 
    $table->timestamps(); 
}); 

Như bạn thấy, timestamps và mã thông báo thậm chí không được liệt kê trong mô hình người dùng. Tất cả các fillable khi được định nghĩa sẽ được thiết lập như là thuộc tính công khai trên đối tượng người dùng ($user->name = 'Bob';, nhưng bạn cũng có thể chuyển nó làm đối số cho phương thức create()/save() kế thừa). Các thực thể không được truy cập trực tiếp trong Laravel, nhưng có ở đây và có thể được xác định rõ hơn nếu cần thiết.

+0

Bạn có thể đề xuất mã liên quan đến giải pháp này không? – gdmanandamohon

4

Bạn có thể tạo tùy chỉnh Mutators để có loại thuộc tính tùy chỉnh đó sẽ ánh xạ chúng vào các trường cơ sở dữ liệu trong Laravel.

class Tag extends Model 
{ 
    public function getFullNameAttribute() 
    { 
     return $this->first_name.' '.$this->last_name; 
    } 

    public function setFullNameAttribute($value) 
    { 
     list($this->first_name, $this->last_name) = explode(' ', $value); 
    } 
} 

và sau đó bạn có thể sử dụng nó như thế này sau khi bạn khởi tạo mô hình:

$tag->full_name = "Christos Lytras"; 
echo $tag->first_name; // prints "Christos" 
echo $tag->last_name; // prints "Lytras" 

Đây là một ảnh chụp màn hình tinker:

Artisan Tinker Example

Các vấn đề liên quan